.westus.cloudapp.azure.com'. Up to 62 chars, digits or dashes, lowercase, should start with a letter: must conform to '^[a-z][a-z0-9-]{1,61}[a-z0-9]$'."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the administrator of the new VM. Exclusion list: 'admin','administrator'"
+ },
+ "value": "pietro"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the administrator account of the new VM"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "windowsVmSku": {
+ "type": "string",
+ "defaultValue": "2019-Datacenter",
+ "metadata": {
+ "description": "Windows Image VM SKU"
+ }
+ },
+ "sqlVmOffer": {
+ "type": "string",
+ "defaultValue": "sql2019-ws2019",
+ "metadata": {
+ "description": "SQL VM Image Offer"
+ }
+ },
+ "sqlVmSku": {
+ "type": "string",
+ "defaultValue": "standard",
+ "allowedValues": [
+ "standard",
+ "enterprise"
+ ],
+ "metadata": {
+ "description": "SQL VM Image SKU"
+ }
+ },
+ "sqlVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "metadata": {
+ "description": "SQL VM Size"
+ }
+ },
+ "windowsVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "metadata": {
+ "description": "Windows VM Size"
+ }
+ }
+ },
+ "variables": {
+ "vnetAddressRange": "10.0.0.0/16",
+ "subnetAddressRange": "10.0.0.0/24",
+ "subnetName": "Subnet",
+ "vnetName": "VNET",
+ "numberOfInstances": 2,
+ "availabilitySetName": "myavlset",
+ "vmName": "vm",
+ "nicsql": "vmsql",
+ "newStorageAccountName": "[concat('st', uniqueString(resourceGroup().id))]",
+ "subnet-id": "Microsoft.Network/virtualNetworks/subnets/VNET/Subnet",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "SQLimagePublisher": "MicrosoftSQLServer",
+ "networkSecurityGroupName": "Subnet-nsg"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-03-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIp",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-03-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "vmsqlIp",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myavlset",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2
+ }
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('newStorageAccountName')]",
+ "location": "[resourceGroup().location]",
+ "kind": "StorageV2",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "comments": "Simple Network Security Group for subnet [Subnet]",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-08-01",
+ "name": "Subnet-nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2020-03-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "VNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/Subnet-nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/Subnet-nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-03-01",
+ "name": "loadBalancer",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/publicIp"
+ ],
+ "properties": {
+ "frontendIpConfigurations": [
+ {
+ "name": "LBFE",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIp"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LBBAP"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "rdp0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/loadBalancer/LBFE"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 6001,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "rdp1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/loadBalancer/LBFE"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 6002,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/loadBalancer/LBFE"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/loadBalancer/lbprobe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "idleTimeoutInMinutes": 15
+ },
+ "name": "lbrule"
+ }
+ ],
+ "probes": [
+ {
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 15,
+ "numberOfProbes": 2
+ },
+ "name": "lbprobe"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-03-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "vmsql",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-rdp",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-03-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "vmcopyindex()",
+ "copy": {
+ "name": "netIntLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "VNET",
+ "Microsoft.Network/loadBalancers/loadBalancer"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/Subnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/loadBalancer/rdpcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-03-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "vmsql",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "VNET",
+ "Microsoft.Network/networkSecurityGroups/vmsql"
+ ],
+ "properties": {
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/vmsql"
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/vmsqlIp"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('newStorageAccountName'))]",
+ "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myavlset"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "vmcopyindex()",
+ "adminUsername": "pietro",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmcopyindex()"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('newStorageAccountName')).primaryEndpoints.blob]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmsql",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('newStorageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces', variables('nicsql'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "vmsql",
+ "adminUsername": "pietro",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftSQLServer",
+ "offer": "sql2019-ws2019",
+ "sku": "standard",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmsql"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('newStorageAccountName')).primaryEndpoints.blob]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT599 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT599
new file mode 100644
index 0000000..8ffa756
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT599
@@ -0,0 +1,476 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/2fe-linux-lb80-ssh-1be-win-nsg-rdp-datadisk-ssd/azuredeploy.json",
+ "/demos/2fe-linux-lb80-ssh-1be-win-nsg-rdp-datadisk-ssd/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897681,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/2fe-linux-lb80-ssh-1be-win-nsg-rdp-datadisk-ssd/azuredeploy.json",
+ "/demos/2fe-linux-lb80-ssh-1be-win-nsg-rdp-datadisk-ssd/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT599",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT599",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicDnsName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS prefix for the deployment. Up to 62 chars, digits or dashes, lowercase, should start with a letter: must conform to '^[a-z][a-z0-9-]{1,61}[a-z0-9]$'."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the administrator of the new VM. Exclusion list: 'admin','administrator'"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the administrator account of the new VM"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sizeOfDiskInGB": {
+ "type": "int",
+ "defaultValue": 128,
+ "minValue": 128,
+ "maxValue": 1024,
+ "metadata": {
+ "description": "Size of data disk in GB 128-1024"
+ }
+ },
+ "vmSizeFE": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "VM size allowed for Front End"
+ }
+ },
+ "vmSizeSQL": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "VM size allowed for SQL Server Back End"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "vnetAddressRange": "10.0.0.0/16",
+ "subnetAddressRange": "10.0.0.0/24",
+ "subnetName": "Subnet",
+ "numberOfInstances": 2,
+ "availabilitySetName": "myavlset",
+ "vmName": "vm",
+ "nicsql": "vmsql",
+ "storageAccountNameDiag": "[concat('diag',uniqueString(resourceGroup().id))]",
+ "subnet-id": "Microsoft.Network/virtualNetworks/subnets/VNET/Subnet",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "imageSku": "14.04.5-LTS",
+ "SQLimagePublisher": "MicrosoftSQLServer",
+ "SQLimageOffer": "sql2019-ws2019",
+ "SQLimageSku": "Standard",
+ "networkSecurityGroupName": "Subnet-nsg"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIp",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "vmsqlIp",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myavlset",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2
+ }
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountNameDiag')]",
+ "location": "[resourceGroup().location]",
+ "kind": "StorageV2",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "comments": "Simple Network Security Group for subnet [Subnet]",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-08-01",
+ "name": "Subnet-nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "VNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/Subnet-nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/Subnet-nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2018-10-01",
+ "name": "loadBalancer",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "publicIp"
+ ],
+ "properties": {
+ "frontendIpConfigurations": [
+ {
+ "name": "LBFE",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIp"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LBBAP"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "rdp0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/loadBalancer/LBFE"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 6001,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "rdp1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/loadBalancer/LBFE"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 6002,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/loadBalancer/LBFE"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/loadBalancer/lbprobe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "idleTimeoutInMinutes": 15
+ },
+ "name": "lbrule"
+ }
+ ],
+ "probes": [
+ {
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 15,
+ "numberOfProbes": 2
+ },
+ "name": "lbprobe"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "vmsql",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-rdp",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "vmcopyindex()",
+ "copy": {
+ "name": "netIntLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "VNET",
+ "loadBalancer"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/Subnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/loadBalancer/rdpcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "vmsql",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "VNET",
+ "Microsoft.Network/networkSecurityGroups/vmsql"
+ ],
+ "properties": {
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/vmsql"
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/vmsqlIp"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountNameDiag'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmName'),copyindex()))]",
+ "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myavlset"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "vmcopyindex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmcopyindex()"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('storageAccountNameDiag'), '2019-06-01').primaryEndpoints.blob]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmsql",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountNameDiag'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces', variables('nicsql'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "vmsql",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftSQLServer",
+ "offer": "sql2019-ws2019",
+ "sku": "Standard",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": 128,
+ "lun": 0,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": 128,
+ "lun": 1,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmsql"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('storageAccountNameDiag'), '2019-06-01').primaryEndpoints.blob]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT6 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT6
new file mode 100644
index 0000000..3e4cde3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT6
@@ -0,0 +1,73 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/nestedtemplates/nic.json"
+ ],
+ "timestamp": 1642962883306,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/nestedtemplates/nic.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT6",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT6",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "Description": "The name of the NIC to Create or Update"
+ }
+ },
+ "ipConfigurations": {
+ "type": "array",
+ "metadata": {
+ "Description": "The IP configurations of the NIC"
+ }
+ },
+ "dnsServers": {
+ "type": "array",
+ "metadata": {
+ "Description": "The DNS Servers of the NIC"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "nicName",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "location",
+ "apiVersion": "2020-03-01",
+ "properties": {
+ "ipConfigurations": "ipConfigurations",
+ "dnsSettings": {
+ "dnsServers": "dnsServers"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT60 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT60
new file mode 100644
index 0000000..b47119e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT60
@@ -0,0 +1,420 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/chef-json-parameters-linux-vm/azuredeploy.json",
+ "/application-workloads/chef/chef-json-parameters-linux-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962884410,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/chef-json-parameters-linux-vm/azuredeploy.json",
+ "/application-workloads/chef/chef-json-parameters-linux-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT60",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT60",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmDnsName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS name for the VM"
+ },
+ "value": "GET-PREREQ-vmdnsName"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin user name for the Virtual Machines"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "osType": {
+ "type": "string",
+ "allowedValues": [
+ "Ubuntu-18.04-LTS",
+ "Ubuntu-12.04.5-LTS",
+ "Centos-7.1",
+ "Centos-7"
+ ],
+ "defaultValue": "Ubuntu-18.04-LTS",
+ "metadata": {
+ "description": "The type of the operating system you want to deploy."
+ },
+ "value": "Ubuntu-18.04-LTS"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A0",
+ "metadata": {
+ "description": "VM Size"
+ },
+ "value": "Standard_A0"
+ },
+ "chef_node_name": {
+ "type": "string",
+ "metadata": {
+ "description": "The name for the node (VM) in the Chef Organization"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "chef_server_url": {
+ "type": "string",
+ "metadata": {
+ "description": "Organization URL for the Chef Server. Example https://ChefServerDnsName.cloudapp.net/organizations/Orgname"
+ },
+ "value": "GET-PREREQ-chefserverurl"
+ },
+ "validation_client_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Validator key name for the organization. Example : MyOrg-validator"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "runlist": {
+ "type": "string",
+ "defaultValue": "recipe[getting-started]",
+ "metadata": {
+ "description": "Optional Run List to Execute"
+ },
+ "value": "recipe[getting-started]"
+ },
+ "validation_key": {
+ "type": "string",
+ "metadata": {
+ "description": "JSON Escaped Validation Key"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "validation_key_format": {
+ "type": "string",
+ "allowedValues": [
+ "plaintext",
+ "base64encoded"
+ ],
+ "defaultValue": "plaintext",
+ "metadata": {
+ "description": "Format in which Validation Key is given. e.g. plaintext, base64encoded"
+ },
+ "value": "plaintext"
+ },
+ "secret": {
+ "type": "securestring",
+ "defaultValue": "[uniqueString(newGuid())]",
+ "metadata": {
+ "description": "Encrypted Data bag secret"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "chef_service_interval": {
+ "type": "string",
+ "defaultValue": "30",
+ "metadata": {
+ "description": "Frequency(in minutes) at which the chef-service runs."
+ },
+ "value": "60"
+ },
+ "bootstrap_version": {
+ "type": "string",
+ "defaultValue": "latest",
+ "metadata": {
+ "description": "Chef Client Version"
+ },
+ "value": "12.15.19"
+ },
+ "bootstrap_channel": {
+ "type": "string",
+ "defaultValue": "stable",
+ "metadata": {
+ "description": "Release channel for Chef Client Version"
+ },
+ "value": "stable"
+ },
+ "daemon": {
+ "type": "string",
+ "defaultValue": "service",
+ "metadata": {
+ "description": "Daemon option is only for Windows. Allowed values: none/service/task"
+ },
+ "value": "none"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "images": {
+ "Ubuntu-18.04-LTS": {
+ "sku": "18.04-LTS",
+ "offer": "UbuntuServer",
+ "publisher": "Canonical"
+ },
+ "Ubuntu-12.04.5-LTS": {
+ "sku": "12.04.5-LTS",
+ "offer": "UbuntuServer",
+ "publisher": "Canonical"
+ },
+ "Centos-7.1": {
+ "sku": "7.1",
+ "offer": "CentOS",
+ "publisher": "OpenLogic"
+ },
+ "Centos-7": {
+ "sku": "7",
+ "offer": "CentOS",
+ "publisher": "OpenLogic"
+ }
+ },
+ "vmExtensionName": "LinuxChefExtension",
+ "vmName": "GET-PREREQ-vmdnsName",
+ "storageAccountType": "Standard_LRS",
+ "newStorageAccountName": "[concat(uniquestring(resourceGroup().id), 'cheflinuxvm')]",
+ "publicIPAddressName": "myPublicIP1",
+ "publicIPAddressType": "Dynamic",
+ "virtualNetworkName": "MyVNET1",
+ "addressPrefix": "10.0.0.0/16",
+ "subnet1Name": "subnet-1",
+ "subnet2Name": "subnet-2",
+ "subnet1Prefix": "10.0.0.0/24",
+ "subnet2Prefix": "10.0.1.0/24",
+ "nicName": "myVMNic",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('newStorageAccountName')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP1",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GET-PREREQ-vmdnsName"
+ }
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-08-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-22",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET1",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ },
+ {
+ "name": "subnet-2",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP1",
+ "Microsoft.Network/virtualNetworks//MyVNET1"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP1"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET1/subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GET-PREREQ-vmdnsName",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('newStorageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A0"
+ },
+ "osProfile": {
+ "computerName": "GET-PREREQ-vmdnsName",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "(images)[parameters(osType)].publisher",
+ "offer": "(images)[parameters(osType)].offer",
+ "sku": "(images)[parameters(osType)].sku",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GET-PREREQ-vmdnsName_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GET-PREREQ-vmdnsName/LinuxChefExtension",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GET-PREREQ-vmdnsName"
+ ],
+ "properties": {
+ "publisher": "Chef.Bootstrap.WindowsAzure",
+ "type": "LinuxChefClient",
+ "typeHandlerVersion": "1210.12",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "bootstrap_options": {
+ "chef_node_name": "GEN-UNIQUE",
+ "chef_server_url": "GET-PREREQ-chefserverurl",
+ "validation_client_name": "GEN-UNIQUE"
+ },
+ "runlist": "recipe[getting-started]",
+ "validation_key_format": "plaintext",
+ "chef_service_interval": "60",
+ "bootstrap_version": "12.15.19",
+ "bootstrap_channel": "stable",
+ "daemon": "none"
+ },
+ "protectedSettings": {
+ "validation_key": "GEN-UNIQUE",
+ "secret": "GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT600 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT600
new file mode 100644
index 0000000..c6dc1af
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT600
@@ -0,0 +1,296 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/aci-bc/azuredeploy.json",
+ "/demos/aci-bc/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897713,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/aci-bc/azuredeploy.json",
+ "/demos/aci-bc/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT600",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.containerinstance/containergroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT600",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1124.51302",
+ "templateHash": "15438671126649560723"
+ }
+ },
+ "parameters": {
+ "contGroupName": {
+ "type": "string",
+ "defaultValue": "msdyn365bc",
+ "metadata": {
+ "description": "Name for the container group"
+ }
+ },
+ "dnsPrefix": {
+ "type": "string",
+ "maxLength": 50,
+ "metadata": {
+ "description": "The DNS label for the public IP address. It must be lowercase. It should match the following regular expression, or it will raise an error: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "letsEncryptMail": {
+ "type": "string",
+ "metadata": {
+ "description": "The eMail address to be used when requesting a Let's Encrypt certificate"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "bcRelease": {
+ "type": "string",
+ "defaultValue": "mcr.microsoft.com/businesscentral:10.0.19041.985",
+ "metadata": {
+ "description": "Dynamics 365 Business Central Generic image (10.0.19041.985 is the version of Windows Server). See https://mcr.microsoft.com/v2/businesscentral/tags/list"
+ }
+ },
+ "bcArtifactUrl": {
+ "type": "string",
+ "defaultValue": "https://bcartifacts.azureedge.net/onprem/19.2.32968.33504/w1",
+ "metadata": {
+ "description": "Dynamics 365 Business Central artifact URL. See https://freddysblog.com/2020/06/25/working-with-artifacts/ to understand how to find the right one."
+ }
+ },
+ "username": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for your BC super user"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "password": {
+ "type": "secureString",
+ "metadata": {
+ "description": "Password for your BC super user and your sa user on the database"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "cpuCores": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "The number of CPU cores to allocate to the container"
+ }
+ },
+ "memoryInGb": {
+ "type": "int",
+ "defaultValue": 4,
+ "metadata": {
+ "description": "The amount of memory to allocate to the container in gigabytes. Provide a minimum of 3 as he container will include SQL Server and BCST"
+ }
+ },
+ "customNavSettings": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Custom settings for the BCST"
+ }
+ },
+ "customWebSettings": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Custom settings for the Web Client"
+ }
+ },
+ "acceptEula": {
+ "type": "string",
+ "defaultValue": "N",
+ "allowedValues": [
+ "Y",
+ "N"
+ ],
+ "metadata": {
+ "description": "Change to 'Y' to accept the end user license agreement available at https://go.microsoft.com/fwlink/?linkid=861843. This is necessary to successfully run the container"
+ },
+ "value": "Y"
+ },
+ "azurecontainerSuffix": {
+ "type": "string",
+ "defaultValue": ".azurecontainer.io",
+ "allowedValues": [
+ ".azurecontainer.io"
+ ],
+ "metadata": {
+ "description": "Please select the Azure container URL suffix for your current region. For the standard Azure cloud, this is azurecontainer.io"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Default location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "secureString",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ }
+ }
+ },
+ "variables": {
+ "image": "mcr.microsoft.com/businesscentral:10.0.19041.985",
+ "publicdnsname": "[format('{0}.{1}{2}', parameters('dnsPrefix'), parameters('location'), parameters('azurecontainerSuffix'))]",
+ "foldersZipUri": "[uri(parameters('_artifactsLocation'), format('scripts/SetupCertificate.zip{0}', parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ContainerInstance/containerGroups",
+ "apiVersion": "2021-09-01",
+ "name": "msdyn365bc",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "containers": [
+ {
+ "name": "msdyn365bc",
+ "properties": {
+ "environmentVariables": [
+ {
+ "name": "ACCEPT_EULA",
+ "value": "Y"
+ },
+ {
+ "name": "accept_outdated",
+ "value": "y"
+ },
+ {
+ "name": "username",
+ "value": "GEN-UNIQUE-10"
+ },
+ {
+ "name": "password",
+ "value": "GEN-PASSWORD"
+ },
+ {
+ "name": "customNavSettings",
+ "value": ""
+ },
+ {
+ "name": "customWebSettings",
+ "value": ""
+ },
+ {
+ "name": "PublicDnsName",
+ "value": "[format('{0}.{1}{2}', parameters('dnsPrefix'), parameters('location'), parameters('azurecontainerSuffix'))]"
+ },
+ {
+ "name": "folders",
+ "value": "[format('c:\\run\\my={0}', variables('foldersZipUri'))]"
+ },
+ {
+ "name": "ContactEMailForLetsEncrypt",
+ "value": "GEN-UNIQUE"
+ },
+ {
+ "name": "artifacturl",
+ "value": "https://bcartifacts.azureedge.net/onprem/19.2.32968.33504/w1"
+ },
+ {
+ "name": "certificatePfxPassword",
+ "value": "GEN-PASSWORD"
+ }
+ ],
+ "image": "mcr.microsoft.com/businesscentral:10.0.19041.985",
+ "ports": [
+ {
+ "protocol": "TCP",
+ "port": 443
+ },
+ {
+ "protocol": "TCP",
+ "port": 8080
+ },
+ {
+ "protocol": "TCP",
+ "port": 7049
+ },
+ {
+ "protocol": "TCP",
+ "port": 7048
+ },
+ {
+ "protocol": "TCP",
+ "port": 80
+ }
+ ],
+ "resources": {
+ "requests": {
+ "cpu": 2,
+ "memoryInGB": 4
+ }
+ }
+ }
+ }
+ ],
+ "restartPolicy": "Never",
+ "osType": "Windows",
+ "ipAddress": {
+ "type": "Public",
+ "ports": [
+ {
+ "protocol": "TCP",
+ "port": 443
+ },
+ {
+ "protocol": "TCP",
+ "port": 8080
+ },
+ {
+ "protocol": "TCP",
+ "port": 7049
+ },
+ {
+ "protocol": "TCP",
+ "port": 7048
+ },
+ {
+ "protocol": "TCP",
+ "port": 80
+ }
+ ],
+ "dnsNameLabel": "GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "containerIPAddressFqdn": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups', parameters('contGroupName'))).ipAddress.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT603 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT603
new file mode 100644
index 0000000..c9a57df
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT603
@@ -0,0 +1,2424 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/aks-nat-agic/azuredeploy.json",
+ "/demos/aks-nat-agic/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897790,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/aks-nat-agic/azuredeploy.json",
+ "/demos/aks-nat-agic/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT603",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.network/bastionhosts",
+ "microsoft.network/privateendpoints",
+ "microsoft.network/virtualnetworks",
+ "microsoft.authorization/roleassignments",
+ "microsoft.network/privatednszones/virtualnetworklinks",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.containerservice/managedclusters",
+ "microsoft.managedidentity/userassignedidentities",
+ "microsoft.keyvault/vaults",
+ "microsoft.network/privatednszones",
+ "microsoft.network/networkinterfaces",
+ "microsoft.network/applicationgatewaywebapplicationfirewallpolicies",
+ "microsoft.insights/activitylogalerts",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/publicipprefixes",
+ "microsoft.network/natgateways",
+ "microsoft.network/applicationgateways",
+ "microsoft.storage/storageaccounts",
+ "microsoft.containerregistry/registries",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT603",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "location": {
+ "defaultValue": "[resourceGroup().location]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "aksClusterName": {
+ "defaultValue": "[concat('aks-', uniqueString(resourceGroup().id))]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the AKS cluster."
+ }
+ },
+ "aksClusterDnsPrefix": {
+ "defaultValue": "[parameters('aksClusterName')]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the DNS prefix specified when creating the managed cluster."
+ }
+ },
+ "aksClusterTags": {
+ "defaultValue": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ },
+ "type": "object",
+ "metadata": {
+ "description": "Specifies the tags of the AKS cluster."
+ }
+ },
+ "aksClusterNetworkPlugin": {
+ "defaultValue": "azure",
+ "type": "string",
+ "allowedValues": [
+ "azure",
+ "kubenet"
+ ],
+ "metadata": {
+ "description": "Specifies the network plugin used for building Kubernetes network. - azure or kubenet."
+ }
+ },
+ "aksClusterNetworkPolicy": {
+ "defaultValue": "azure",
+ "type": "string",
+ "allowedValues": [
+ "azure",
+ "calico"
+ ],
+ "metadata": {
+ "description": "Specifies the network policy used for building Kubernetes network. - calico or azure"
+ }
+ },
+ "aksClusterPodCidr": {
+ "defaultValue": "10.244.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range from which to assign pod IPs when kubenet is used."
+ }
+ },
+ "aksClusterServiceCidr": {
+ "defaultValue": "10.3.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "A CIDR notation IP range from which to assign service cluster IPs. It must not overlap with any Subnet IP ranges."
+ }
+ },
+ "aksClusterDnsServiceIP": {
+ "defaultValue": "10.3.0.10",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the IP address assigned to the Kubernetes DNS service. It must be within the Kubernetes service address range specified in serviceCidr."
+ }
+ },
+ "aksClusterDockerBridgeCidr": {
+ "defaultValue": "172.17.0.1/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range assigned to the Docker bridge network. It must not overlap with any Subnet IP ranges or the Kubernetes service address range."
+ }
+ },
+ "aksClusterLoadBalancerSku": {
+ "defaultValue": "standard",
+ "type": "string",
+ "allowedValues": [
+ "basic",
+ "standard"
+ ],
+ "metadata": {
+ "description": "Specifies the sku of the load balancer used by the virtual machine scale sets used by nodepools."
+ }
+ },
+ "aksClusterOutboundType": {
+ "defaultValue": "userAssignedNATGateway",
+ "type": "string",
+ "allowedValues": [
+ "loadBalancer",
+ "managedNATGateway",
+ "userAssignedNATGateway",
+ "userDefinedRouting"
+ ],
+ "metadata": {
+ "description": "Specifies outbound (egress) routing method. - loadBalancer or userDefinedRouting."
+ }
+ },
+ "aksClusterSkuTier": {
+ "type": "string",
+ "defaultValue": "Paid",
+ "allowedValues": [
+ "Paid",
+ "Free"
+ ],
+ "metadata": {
+ "description": "Specifies the tier of a managed cluster SKU: Paid or Free"
+ }
+ },
+ "aksClusterKubernetesVersion": {
+ "type": "string",
+ "defaultValue": "1.21.2",
+ "metadata": {
+ "description": "Specifies the version of Kubernetes specified when creating the managed cluster."
+ }
+ },
+ "aksClusterAdminUsername": {
+ "defaultValue": "azureuser",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the administrator username of Linux virtual machines."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "aksClusterSshPublicKey": {
+ "defaultValue": null,
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the SSH RSA public key string for the Linux nodes."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "aadProfileTenantId": {
+ "defaultValue": "[subscription().tenantId]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the tenant id of the Azure Active Directory used by the AKS cluster for authentication."
+ }
+ },
+ "aadProfileAdminGroupObjectIDs": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the AAD group object IDs that will have admin role of the cluster."
+ }
+ },
+ "aksClusterEnablePrivateCluster": {
+ "defaultValue": false,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to create the cluster as a private cluster or not."
+ }
+ },
+ "aadProfileManaged": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to enable managed AAD integration."
+ }
+ },
+ "aadProfileEnableAzureRBAC": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to to enable Azure RBAC for Kubernetes authorization."
+ }
+ },
+ "systemNodePoolName": {
+ "defaultValue": "system",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the unique name of of the system node pool profile in the context of the subscription and resource group."
+ }
+ },
+ "systemNodePoolVmSize": {
+ "defaultValue": "Standard_D16s_v3",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the vm size of nodes in the system node pool."
+ }
+ },
+ "systemNodePoolOsDiskSizeGB": {
+ "defaultValue": 100,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the OS Disk Size in GB to be used to specify the disk size for every machine in the system agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified.."
+ }
+ },
+ "systemNodePoolAgentCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the number of agents (VMs) to host docker containers in the system node pool. Allowed values must be in the range of 1 to 100 (inclusive). The default value is 1."
+ }
+ },
+ "systemNodePoolOsType": {
+ "defaultValue": "Linux",
+ "type": "string",
+ "allowedValues": [
+ "Linux",
+ "Windows"
+ ],
+ "metadata": {
+ "description": "Specifies the OS type for the vms in the system node pool. Choose from Linux and Windows. Default to Linux."
+ }
+ },
+ "systemNodePoolMaxPods": {
+ "defaultValue": 30,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of pods that can run on a node in the system node pool. The maximum number of pods per node in an AKS cluster is 250. The default maximum number of pods per node varies between kubenet and Azure CNI networking, and the method of cluster deployment."
+ }
+ },
+ "systemNodePoolMaxCount": {
+ "defaultValue": 5,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of nodes for auto-scaling for the system node pool."
+ }
+ },
+ "systemNodePoolMinCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the minimum number of nodes for auto-scaling for the system node pool."
+ }
+ },
+ "systemNodePoolEnableAutoScaling": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to enable auto-scaling for the system node pool."
+ }
+ },
+ "systemNodePoolScaleSetPriority": {
+ "defaultValue": "Regular",
+ "allowedValues": [
+ "Spot",
+ "Regular"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the virtual machine scale set priority in the system node pool: Spot or Regular."
+ }
+ },
+ "systemNodePoolScaleSetEvictionPolicy": {
+ "defaultValue": "Delete",
+ "allowedValues": [
+ "Delete",
+ "Deallocate"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the ScaleSetEvictionPolicy to be used to specify eviction policy for spot virtual machine scale set. Default to Delete. Allowed values are Delete or Deallocate."
+ }
+ },
+ "systemNodePoolNodeLabels": {
+ "defaultValue": {},
+ "type": "object",
+ "metadata": {
+ "description": "Specifies the Agent pool node labels to be persisted across all nodes in the system node pool."
+ }
+ },
+ "systemNodePoolNodeTaints": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the taints added to new nodes during node pool create and scale. For example, key=value:NoSchedule. - string"
+ }
+ },
+ "systemNodePoolType": {
+ "defaultValue": "VirtualMachineScaleSets",
+ "type": "string",
+ "allowedValues": [
+ "VirtualMachineScaleSets",
+ "AvailabilitySet"
+ ],
+ "metadata": {
+ "description": "Specifies the type for the system node pool: VirtualMachineScaleSets or AvailabilitySet"
+ }
+ },
+ "systemNodePoolAvailabilityZones": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the availability zones for the agent nodes in the system node pool. Requirese the use of VirtualMachineScaleSets as node pool type."
+ }
+ },
+ "userNodePoolName": {
+ "defaultValue": "user",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the unique name of of the user node pool profile in the context of the subscription and resource group."
+ }
+ },
+ "userNodePoolVmSize": {
+ "defaultValue": "Standard_D16s_v3",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the vm size of nodes in the user node pool."
+ }
+ },
+ "userNodePoolOsDiskSizeGB": {
+ "defaultValue": 100,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the OS Disk Size in GB to be used to specify the disk size for every machine in the system agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified.."
+ }
+ },
+ "userNodePoolAgentCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the number of agents (VMs) to host docker containers in the user node pool. Allowed values must be in the range of 1 to 100 (inclusive). The default value is 1."
+ }
+ },
+ "userNodePoolOsType": {
+ "defaultValue": "Linux",
+ "type": "string",
+ "allowedValues": [
+ "Linux",
+ "Windows"
+ ],
+ "metadata": {
+ "description": "Specifies the OS type for the vms in the user node pool. Choose from Linux and Windows. Default to Linux."
+ }
+ },
+ "userNodePoolMaxPods": {
+ "defaultValue": 30,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of pods that can run on a node in the user node pool. The maximum number of pods per node in an AKS cluster is 250. The default maximum number of pods per node varies between kubenet and Azure CNI networking, and the method of cluster deployment."
+ }
+ },
+ "userNodePoolMaxCount": {
+ "defaultValue": 5,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of nodes for auto-scaling for the user node pool."
+ }
+ },
+ "userNodePoolMinCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the minimum number of nodes for auto-scaling for the user node pool."
+ }
+ },
+ "userNodePoolEnableAutoScaling": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to enable auto-scaling for the user node pool."
+ }
+ },
+ "userNodePoolScaleSetPriority": {
+ "defaultValue": "Regular",
+ "allowedValues": [
+ "Spot",
+ "Regular"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the virtual machine scale set priority in the user node pool: Spot or Regular."
+ }
+ },
+ "userNodePoolScaleSetEvictionPolicy": {
+ "defaultValue": "Delete",
+ "allowedValues": [
+ "Delete",
+ "Deallocate"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the ScaleSetEvictionPolicy to be used to specify eviction policy for spot virtual machine scale set. Default to Delete. Allowed values are Delete or Deallocate."
+ }
+ },
+ "userNodePoolNodeLabels": {
+ "defaultValue": {},
+ "type": "object",
+ "metadata": {
+ "description": "Specifies the Agent pool node labels to be persisted across all nodes in the user node pool."
+ }
+ },
+ "userNodePoolNodeTaints": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the taints added to new nodes during node pool create and scale. For example, key=value:NoSchedule. - string"
+ }
+ },
+ "userNodePoolType": {
+ "defaultValue": "VirtualMachineScaleSets",
+ "type": "string",
+ "allowedValues": [
+ "VirtualMachineScaleSets",
+ "AvailabilitySet"
+ ],
+ "metadata": {
+ "description": "Specifies the type for the user node pool: VirtualMachineScaleSets or AvailabilitySet"
+ }
+ },
+ "userNodePoolAvailabilityZones": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the availability zones for the agent nodes in the user node pool. Requirese the use of VirtualMachineScaleSets as node pool type."
+ }
+ },
+ "httpApplicationRoutingEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether the httpApplicationRouting add-on is enabled or not."
+ }
+ },
+ "aciConnectorLinuxEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether the aciConnectorLinux add-on is enabled or not."
+ }
+ },
+ "azurePolicyEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether the azurepolicy add-on is enabled or not."
+ }
+ },
+ "kubeDashboardEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether the kubeDashboard add-on is enabled or not."
+ }
+ },
+ "podIdentityProfileEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether the pod identity addon is enabled.."
+ }
+ },
+ "autoScalerProfileScanInterval": {
+ "type": "string",
+ "defaultValue": "10s",
+ "metadata": {
+ "description": "Specifies the scan interval of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownDelayAfterAdd": {
+ "type": "string",
+ "defaultValue": "10m",
+ "metadata": {
+ "description": "Specifies the scale down delay after add of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownDelayAfterDelete": {
+ "type": "string",
+ "defaultValue": "20s",
+ "metadata": {
+ "description": "Specifies the scale down delay after delete of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownDelayAfterFailure": {
+ "type": "string",
+ "defaultValue": "3m",
+ "metadata": {
+ "description": "Specifies scale down delay after failure of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownUnneededTime": {
+ "type": "string",
+ "defaultValue": "10m",
+ "metadata": {
+ "description": "Specifies the scale down unneeded time of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownUnreadyTime": {
+ "type": "string",
+ "defaultValue": "20m",
+ "metadata": {
+ "description": "Specifies the scale down unready time of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileUtilizationThreshold": {
+ "type": "string",
+ "defaultValue": "0.5",
+ "metadata": {
+ "description": "Specifies the utilization threshold of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileMaxGracefulTerminationSec": {
+ "type": "string",
+ "defaultValue": "600",
+ "metadata": {
+ "description": "Specifies the max graceful termination time interval in seconds for the auto-scaler of the AKS cluster."
+ }
+ },
+ "virtualNetworkName": {
+ "defaultValue": "[concat(parameters('aksClusterName'), 'Vnet')]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the virtual network."
+ }
+ },
+ "virtualNetworkAddressPrefixes": {
+ "defaultValue": "10.0.0.0/8",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the address prefixes of the virtual network."
+ }
+ },
+ "aksSubnetName": {
+ "defaultValue": "AksSystemSubnet",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the subnet hosting the system node pool of the AKS cluster."
+ }
+ },
+ "aksSubnetAddressPrefix": {
+ "defaultValue": "10.0.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet hosting the system node pool of the AKS cluster."
+ }
+ },
+ "podSubnetName": {
+ "defaultValue": "PodSubnet",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the subnet hosting the pods of the AKS cluster."
+ }
+ },
+ "podSubnetAddressPrefix": {
+ "defaultValue": "10.1.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet hosting the pods of the AKS cluster."
+ }
+ },
+ "vmSubnetName": {
+ "type": "string",
+ "defaultValue": "VmSubnet",
+ "metadata": {
+ "description": "Specifies the name of the subnet which contains the virtual machine."
+ }
+ },
+ "vmSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.2.0.0/24",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet which contains the virtual machine."
+ }
+ },
+ "bastionSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.2.1.0/24",
+ "metadata": {
+ "description": "Specifies the Bastion subnet IP prefix. This prefix must be within vnet IP prefix address space."
+ }
+ },
+ "applicationGatewaySubnetName": {
+ "type": "string",
+ "defaultValue": "ApplicationGatewaySubnet",
+ "metadata": {
+ "description": "Specifies the name of the subnet which contains the the Application Gateway."
+ }
+ },
+ "applicationGatewaySubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.2.2.0/24",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet which contains the Application Gateway."
+ }
+ },
+ "logAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "[concat(parameters('aksClusterName'), 'Workspace')]",
+ "metadata": {
+ "description": "Specifies the name of the Log Analytics Workspace."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "logAnalyticsSku": {
+ "type": "string",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode",
+ "PerGB2018"
+ ],
+ "defaultValue": "PerNode",
+ "metadata": {
+ "description": "Specifies the service tier of the workspace: Free, Standalone, PerNode, Per-GB."
+ }
+ },
+ "logAnalyticsRetentionInDays": {
+ "type": "int",
+ "defaultValue": 60,
+ "metadata": {
+ "description": "Specifies the workspace data retention in days. -1 means Unlimited retention for the Unlimited Sku. 730 days is the maximum allowed for all other Skus."
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "TestVm",
+ "metadata": {
+ "description": "Specifies the name of the virtual machine."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_DS3_v2",
+ "metadata": {
+ "description": "Specifies the size of the virtual machine."
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "Canonical",
+ "metadata": {
+ "description": "Specifies the image publisher of the disk image used to create the virtual machine."
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "UbuntuServer",
+ "metadata": {
+ "description": "Specifies the offer of the platform image or marketplace image used to create the virtual machine."
+ }
+ },
+ "imageSku": {
+ "type": "string",
+ "defaultValue": "18.04-LTS",
+ "metadata": {
+ "description": "Specifies the Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "password",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Specifies the type of authentication when accessing the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "vmAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the administrator account of the virtual machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Specifies the SSH Key or password for the virtual machine. SSH key is recommended."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "diskStorageAccounType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "Premium_ZRS",
+ "StandardSSD_LRS",
+ "StandardSSD_ZRS",
+ "Standard_LRS",
+ "UltraSSD_LRS"
+ ],
+ "metadata": {
+ "description": "Specifies the storage account type for OS and data disk."
+ }
+ },
+ "numDataDisks": {
+ "type": "int",
+ "defaultValue": 1,
+ "minValue": 0,
+ "maxValue": 64,
+ "metadata": {
+ "description": "Specifies the number of data disks of the virtual machine."
+ }
+ },
+ "osDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the VM."
+ }
+ },
+ "dataDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the virtual machine."
+ }
+ },
+ "dataDiskCaching": {
+ "type": "string",
+ "defaultValue": "ReadWrite",
+ "metadata": {
+ "description": "Specifies the caching requirements for the data disks."
+ }
+ },
+ "blobStorageAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('boot', uniquestring(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the globally unique name for the storage account used to store the boot diagnostics logs of the virtual machine."
+ }
+ },
+ "blobStorageAccountPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "BlobStorageAccountPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the boot diagnostics storage account."
+ }
+ },
+ "acrPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "AcrPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the Azure Container Registry."
+ }
+ },
+ "acrName": {
+ "type": "string",
+ "defaultValue": "[concat('acr', uniqueString(resourceGroup().id))]",
+ "minLength": 5,
+ "maxLength": 50,
+ "metadata": {
+ "description": "Name of your Azure Container Registry"
+ }
+ },
+ "acrAdminUserEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Enable admin user that have push / pull permission to the registry."
+ }
+ },
+ "acrNetworkRuleSetDefaultAction": {
+ "type": "string",
+ "defaultValue": "Deny",
+ "allowedValues": [
+ "Allow",
+ "Deny"
+ ],
+ "metadata": {
+ "description": "The default action of allow or deny when no other rules match. Allowed values: Allow or Deny"
+ }
+ },
+ "acrPublicNetworkAccess": {
+ "type": "string",
+ "defaultValue": "Enabled",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Whether or not public network access is allowed for the container registry. Allowed values: Enabled or Disabled"
+ }
+ },
+ "acrSku": {
+ "type": "string",
+ "defaultValue": "Premium",
+ "allowedValues": [
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Tier of your Azure Container Registry."
+ }
+ },
+ "bastionHostName": {
+ "type": "string",
+ "defaultValue": "[concat(parameters('aksClusterName'), 'Bastion')]",
+ "metadata": {
+ "description": "Specifies the name of the Azure Bastion resource."
+ }
+ },
+ "keyVaultPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "KeyVaultPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the Key Vault."
+ }
+ },
+ "keyVaultName": {
+ "type": "string",
+ "defaultValue": "[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the Key Vault resource."
+ }
+ },
+ "keyVaultNetworkRuleSetDefaultAction": {
+ "type": "string",
+ "defaultValue": "Deny",
+ "allowedValues": [
+ "Allow",
+ "Deny"
+ ],
+ "metadata": {
+ "description": "The default action of allow or deny when no other rules match. Allowed values: Allow or Deny"
+ }
+ },
+ "applicationGatewayName": {
+ "type": "string",
+ "defaultValue": "[concat('appgw-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the Application Gateway."
+ }
+ },
+ "applicationGatewayZones": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Specifies the availability zones of the Application Gateway."
+ }
+ },
+ "wafPolicyName": {
+ "type": "String",
+ "defaultValue": "[concat(parameters('applicationGatewayName'), 'WafPolicy')]",
+ "metadata": {
+ "description": "Specifies the name of the WAF policy"
+ }
+ },
+ "wafPolicyMode": {
+ "type": "string",
+ "defaultValue": "Prevention",
+ "allowedValues": [
+ "Detection",
+ "Prevention"
+ ],
+ "metadata": {
+ "description": "Specifies the mode of the WAF policy."
+ }
+ },
+ "wafPolicyState": {
+ "type": "string",
+ "defaultValue": "Enabled",
+ "allowedValues": [
+ "Enabled",
+ "Disabled "
+ ],
+ "metadata": {
+ "description": "Specifies the state of the WAF policy."
+ }
+ },
+ "wafPolicyFileUploadLimitInMb": {
+ "type": "int",
+ "defaultValue": 100,
+ "metadata": {
+ "description": "Specifies the maximum file upload size in Mb for the WAF policy."
+ }
+ },
+ "wafPolicyMaxRequestBodySizeInKb": {
+ "type": "int",
+ "defaultValue": 128,
+ "metadata": {
+ "description": "Specifies the maximum request body size in Kb for the WAF policy."
+ }
+ },
+ "wafPolicyRequestBodyCheck": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies the whether to allow WAF to check request Body."
+ }
+ },
+ "wafPolicyRuleSetType": {
+ "type": "string",
+ "defaultValue": "OWASP",
+ "metadata": {
+ "description": "Specifies the rule set type."
+ }
+ },
+ "wafPolicyRuleSetVersion": {
+ "type": "string",
+ "defaultValue": "3.1",
+ "metadata": {
+ "description": "Specifies the rule set version."
+ }
+ },
+ "natGatewayName": {
+ "defaultValue": "[concat(parameters('aksClusterName'), 'NatGateway')]",
+ "type": "String",
+ "metadata": {
+ "description": "Specifies the name of the NAT gateway resource"
+ }
+ },
+ "publicIPPrefixName": {
+ "type": "string",
+ "defaultValue": "[concat(parameters('aksClusterName'), 'PublicIpPrefix')]",
+ "metadata": {
+ "description": "Specifies the name of the public IP prefix."
+ }
+ },
+ "publicIPPrefixLength": {
+ "type": "int",
+ "defaultValue": 28,
+ "minValue": 28,
+ "maxValue": 31,
+ "metadata": {
+ "description": "Specifies the length of the public IP prefix."
+ }
+ }
+ },
+ "variables": {
+ "readerRoleDefinitionName": "acdd72a7-3385-48ef-bd42-f606fba81ae7",
+ "contributorRoleDefinitionName": "b24988ac-6180-42a0-ab88-20f7382dd24c",
+ "acrPullRoleDefinitionName": "7f951dda-4ed3-4680-a7ca-43fe172d538d",
+ "aksClusterUserDefinedManagedIdentityName": "[concat('aks-', uniqueString(resourceGroup().id))]ManagedIdentity",
+ "aksClusterUserDefinedManagedIdentityId": "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]ManagedIdentity",
+ "applicationGatewayUserDefinedManagedIdentityName": "[concat('appgw-', uniqueString(resourceGroup().id))]ManagedIdentity",
+ "applicationGatewayUserDefinedManagedIdentityId": "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('appgw-', uniqueString(resourceGroup().id))]ManagedIdentity",
+ "aadPodIdentityUserDefinedManagedIdentityName": "[concat('aks-', uniqueString(resourceGroup().id))]AadPodManagedIdentity",
+ "aadPodIdentityUserDefinedManagedIdentityId": "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]AadPodManagedIdentity",
+ "vmSubnetNsgName": "VmSubnetNsg",
+ "vmSubnetNsgId": "Microsoft.Network/networkSecurityGroups/VmSubnetNsg",
+ "virtualNetworkId": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "aksSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AksSystemSubnet",
+ "podSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/PodSubnet",
+ "vmSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet",
+ "applicationGatewaySubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/ApplicationGatewaySubnet",
+ "vmNicName": "TestVmNic",
+ "vmNicId": "Microsoft.Network/networkInterfaces/TestVmNic",
+ "blobStorageAccountId": "Microsoft.Storage/storageAccounts/[concat('boot', uniquestring(resourceGroup().id))]",
+ "blobPublicDNSZoneForwarder": "[concat('blob.', environment().suffixes.storage)]",
+ "blobPrivateDnsZoneName": "[concat('privatelink.', variables('blobPublicDNSZoneForwarder'))]",
+ "blobPrivateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('blobPrivateDnsZoneName'))]",
+ "blobStorageAccountPrivateEndpointGroupName": "blob",
+ "blobPrivateDnsZoneGroupName": "blobPrivateDnsZoneGroup",
+ "blobPrivateDnsZoneGroupId": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/BlobStorageAccountPrivateEndpoint/blobPrivateDnsZoneGroup",
+ "blobStorageAccountPrivateEndpointId": "Microsoft.Network/privateEndpoints/BlobStorageAccountPrivateEndpoint",
+ "vmId": "Microsoft.Compute/virtualMachines/TestVm",
+ "omsAgentForLinuxName": "LogAnalytics",
+ "omsAgentForLinuxId": "Microsoft.Compute/virtualMachines/extensions/TestVm/LogAnalytics",
+ "omsDependencyAgentForLinuxName": "DependencyAgent",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-PASSWORD"
+ }
+ ]
+ },
+ "provisionVMAgent": true
+ },
+ "bastionPublicIpAddressName": "[concat('aks-', uniqueString(resourceGroup().id))]Bastion",
+ "bastionPublicIpAddressId": "Microsoft.Network/publicIPAddresses/[concat(parameters('aksClusterName'), 'Bastion')]PublicIp",
+ "bastionSubnetName": "AzureBastionSubnet",
+ "bastionSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AzureBastionSubnet",
+ "bastionHostId": "Microsoft.Network/bastionHosts/[concat(parameters('aksClusterName'), 'Bastion')]",
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "readerRoleId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('readerRoleDefinitionName'))]",
+ "contributorRoleId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('contributorRoleDefinitionName'))]",
+ "acrPullRoleAssignmentName": "[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('acrPullRoleId'), resourceGroup().id)]",
+ "acrPullRoleId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('acrPullRoleDefinitionName'))]",
+ "aksReaderRoleAssignmentName": "[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('readerRoleId'), resourceGroup().id)]",
+ "aksContributorRoleAssignmentName": "[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('contributorRoleId'), resourceGroup().id)]",
+ "aksContributorRoleAssignmentId": "Microsoft.Authorization/roleAssignments/[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('contributorRoleId'), resourceGroup().id)]",
+ "appGwContributorRoleAssignmentName": "[guid(variables('applicationGatewayUserDefinedManagedIdentityId'), variables('contributorRoleId'), resourceGroup().id)]",
+ "containerInsightsSolutionName": "ContainerInsights(, parameters(logAnalyticsWorkspaceName), )",
+ "acrPublicDNSZoneForwarder": "[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "acrPrivateDnsZoneName": "privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "acrPrivateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "acrPrivateEndpointGroupName": "registry",
+ "acrPrivateDnsZoneGroupName": "registryPrivateDnsZoneGroup",
+ "acrPrivateDnsZoneGroupId": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/AcrPrivateEndpoint/registryPrivateDnsZoneGroup",
+ "acrPrivateEndpointId": "Microsoft.Network/privateEndpoints/AcrPrivateEndpoint",
+ "acrId": "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "aksClusterId": "Microsoft.ContainerService/managedClusters/[concat('aks-', uniqueString(resourceGroup().id))]",
+ "keyVaultPublicDNSZoneForwarder": "[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "keyVaultPrivateDnsZoneName": "privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "keyVaultPrivateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "keyVaultPrivateEndpointId": "Microsoft.Network/privateEndpoints/KeyVaultPrivateEndpoint",
+ "keyVaultPrivateEndpointGroupName": "vault",
+ "keyVaultPrivateDnsZoneGroupName": "vaultPrivateDnsZoneGroup",
+ "keyVaultPrivateDnsZoneGroupId": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/KeyVaultPrivateEndpoint/vaultPrivateDnsZoneGroup",
+ "keyVaultId": "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "wafPolicyId": "Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies/[concat(parameters('applicationGatewayName'), 'WafPolicy')]",
+ "applicationGatewayId": "Microsoft.Network/applicationGateways/[concat('appgw-', uniqueString(resourceGroup().id))]",
+ "applicationGatewayPublicIPAddressName": "[concat('appgw-', uniqueString(resourceGroup().id))]PublicIp",
+ "applicationGatewayPublicIPAddressId": "Microsoft.Network/publicIPAddresses/[concat('appgw-', uniqueString(resourceGroup().id))]PublicIp",
+ "applicationGatewayIPConfigurationName": "applicationGatewayIPConfiguration",
+ "applicationGatewayFrontendIPConfigurationName": "applicationGatewayFrontendIPConfiguration",
+ "applicationGatewayFrontendIPConfigurationId": "Microsoft.Network/applicationGateways/frontendIPConfigurations/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayFrontendIPConfiguration",
+ "applicationGatewayFrontendPortName": "applicationGatewayFrontendPort",
+ "applicationGatewayFrontendPortId": "Microsoft.Network/applicationGateways/frontendPorts/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayFrontendPort",
+ "applicationGatewayHttpListenerName": "applicationGatewayHttpListener",
+ "applicationGatewayHttpListenerId": "Microsoft.Network/applicationGateways/httpListeners/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayHttpListener",
+ "applicationGatewayBackendAddressPoolName": "applicationGatewayBackendPool",
+ "applicationGatewayBackendAddressPoolId": "Microsoft.Network/applicationGateways/backendAddressPools/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayBackendPool",
+ "applicationGatewayBackendHttpSettingsName": "applicationGatewayBackendHttpSettings",
+ "applicationGatewayBackendHttpSettingsId": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayBackendHttpSettings",
+ "applicationGatewayRequestRoutingRuleName": "default",
+ "publicIPPrefixId": "Microsoft.Network/publicIPPrefixes/[concat(parameters('aksClusterName'), 'PublicIpPrefix')]",
+ "natGatewayId": "Microsoft.Network/natGateways/[concat(parameters('aksClusterName'), 'NatGateway')]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPPrefixes",
+ "apiVersion": "2021-03-01",
+ "name": "[concat(parameters('aksClusterName'), 'PublicIpPrefix')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard",
+ "tier": "Regional"
+ },
+ "properties": {
+ "prefixLength": 28,
+ "publicIPAddressVersion": "IPv4"
+ }
+ },
+ {
+ "type": "Microsoft.Network/natGateways",
+ "apiVersion": "2020-06-01",
+ "name": "[concat(parameters('aksClusterName'), 'NatGateway')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPPrefixes/[concat(parameters('aksClusterName'), 'PublicIpPrefix')]"
+ ],
+ "properties": {
+ "idleTimeoutInMinutes": 4,
+ "publicIpPrefixes": [
+ {
+ "id": "Microsoft.Network/publicIPPrefixes/[concat(parameters('aksClusterName'), 'PublicIpPrefix')]"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[variables('bastionPublicIpAddressName')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/bastionHosts",
+ "name": "[concat(parameters('aksClusterName'), 'Bastion')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/[concat(parameters('aksClusterName'), 'Bastion')]PublicIp",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IpConf",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AzureBastionSubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[concat(parameters('aksClusterName'), 'Bastion')]PublicIp"
+ }
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/bastionHosts/[concat(parameters('aksClusterName'), 'Bastion')]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "BastionAuditLogs",
+ "enabled": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2021-08-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[concat('boot', uniquestring(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "apiVersion": "2020-04-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "TestVmNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "TestVm",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/TestVmNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_DS3_v2"
+ },
+ "osProfile": {
+ "computerName": "TestVm",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "TestVm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "diskSizeGB": 50,
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ },
+ "copy": [
+ {
+ "name": "dataDisks",
+ "count": 1,
+ "input": {
+ "caching": "ReadWrite",
+ "diskSizeGB": 50,
+ "lun": "[copyIndex('dataDisks')]",
+ "name": "[concat(parameters('vmName'),'-DataDisk',copyIndex('dataDisks'))]",
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/TestVmNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('blobStorageAccountId')).primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "TestVm/LogAnalytics",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/TestVm",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "publisher": "Microsoft.EnterpriseCloud.Monitoring",
+ "type": "OmsAgentForLinux",
+ "typeHandlerVersion": "1.12",
+ "settings": {
+ "workspaceId": "[reference(variables('workspaceId'), '2020-03-01-preview').customerId]",
+ "stopOnMultipleConnections": false
+ },
+ "protectedSettings": {
+ "workspaceKey": "[listKeys(variables('workspaceId'),'2020-03-01-preview').primarySharedKey]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "TestVm/DependencyAgent",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/TestVm",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "Microsoft.Compute/virtualMachines/extensions/TestVm/LogAnalytics"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Monitoring.DependencyAgent",
+ "type": "DependencyAgentLinux",
+ "typeHandlerVersion": "9.10",
+ "autoUpgradeMinorVersion": true
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "VmSubnetNsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "AllowSshInbound",
+ "properties": {
+ "priority": 100,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/VmSubnetNsg",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "NetworkSecurityGroupEvent",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ },
+ {
+ "category": "NetworkSecurityGroupRuleCounter",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-05-01",
+ "name": "[concat(parameters('aksClusterName'), 'Vnet')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/VmSubnetNsg",
+ "Microsoft.Network/publicIPPrefixes/[concat(parameters('aksClusterName'), 'PublicIpPrefix')]",
+ "Microsoft.Network/natGateways/[concat(parameters('aksClusterName'), 'NatGateway')]"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/8"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "AksSystemSubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/16",
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled",
+ "natGateway": {
+ "id": "Microsoft.Network/natGateways/[concat(parameters('aksClusterName'), 'NatGateway')]"
+ }
+ }
+ },
+ {
+ "name": "PodSubnet",
+ "properties": {
+ "addressPrefix": "10.1.0.0/16",
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled",
+ "natGateway": {
+ "id": "Microsoft.Network/natGateways/[concat(parameters('aksClusterName'), 'NatGateway')]"
+ }
+ }
+ },
+ {
+ "name": "VmSubnet",
+ "properties": {
+ "addressPrefix": "10.2.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/VmSubnetNsg"
+ },
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled",
+ "natGateway": {
+ "id": "Microsoft.Network/natGateways/[concat(parameters('aksClusterName'), 'NatGateway')]"
+ }
+ }
+ },
+ {
+ "name": "ApplicationGatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.2.2.0/24",
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ },
+ {
+ "name": "AzureBastionSubnet",
+ "properties": {
+ "addressPrefix": "10.2.1.0/24"
+ }
+ }
+ ],
+ "enableDdosProtection": false,
+ "enableVmProtection": false
+ }
+ },
+ {
+ "comments": "User-Defined Managed Identity defined for the AKS cluster. Used to access the Virtual Network and other resources.",
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[variables('aksClusterUserDefinedManagedIdentityName')]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "comments": "User-Defined Managed Identity used by the Application Gateway is assigned. Used to access Azure Key Vault.",
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[variables('applicationGatewayUserDefinedManagedIdentityName')]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "comments": "User-Defined Managed Identity used by an AAD Pod Identity. Used to access Azure Key Vault.",
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[variables('aadPodIdentityUserDefinedManagedIdentityName')]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('contributorRoleId'), resourceGroup().id)]",
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]ManagedIdentity",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('contributorRoleDefinitionName'))]",
+ "description": "Assign the cluster user-defined managed identity contributor role on the resource group.",
+ "principalId": "[reference(variables('aksClusterUserDefinedManagedIdentityName')).principalId]",
+ "principalType": "ServicePrincipal",
+ "scope": "[resourceGroup().id]"
+ }
+ },
+ {
+ "comments": "Grant the AKS cluster ingress controller pod managed identity with reader role permissions over Key Vault; paired with the Access Policy, this allows our ingress controller to pull certificates.",
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('readerRoleId'), resourceGroup().id)]",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]AadPodManagedIdentity"
+ ],
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('readerRoleDefinitionName'))]",
+ "principalId": "[reference(variables('aadPodIdentityUserDefinedManagedIdentityId')).principalId]",
+ "principalType": "ServicePrincipal",
+ "scope": "[resourceGroup().id]"
+ }
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('acrPullRoleId'), resourceGroup().id)]",
+ "dependsOn": [
+ "Microsoft.ContainerService/managedClusters/[concat('aks-', uniqueString(resourceGroup().id))]",
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('acrPullRoleDefinitionName'))]",
+ "principalId": "[reference(variables('aksClusterId'), '2020-12-01', 'Full').properties.identityProfile.kubeletidentity.objectId]",
+ "principalType": "ServicePrincipal",
+ "scope": "[resourceGroup().id]"
+ }
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults",
+ "apiVersion": "2019-09-01",
+ "name": "[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('appgw-', uniqueString(resourceGroup().id))]ManagedIdentity",
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]AadPodManagedIdentity"
+ ],
+ "properties": {
+ "accessPolicies": [
+ {
+ "tenantId": "[reference(variables('applicationGatewayUserDefinedManagedIdentityId')).tenantId]",
+ "objectId": "[reference(variables('applicationGatewayUserDefinedManagedIdentityId')).principalId]",
+ "permissions": {
+ "secrets": [
+ "get",
+ "list"
+ ],
+ "certificates": [
+ "get"
+ ]
+ }
+ },
+ {
+ "tenantId": "[reference(variables('aadPodIdentityUserDefinedManagedIdentityId')).tenantId]",
+ "objectId": "[reference(variables('aadPodIdentityUserDefinedManagedIdentityId')).principalId]",
+ "permissions": {
+ "secrets": [
+ "get",
+ "list"
+ ],
+ "certificates": [
+ "get"
+ ]
+ }
+ }
+ ],
+ "sku": {
+ "family": "A",
+ "name": "standard"
+ },
+ "tenantId": "[subscription().tenantId]",
+ "networkAcls": {
+ "bypass": "AzureServices",
+ "defaultAction": "Deny"
+ },
+ "enabledForDeployment": false,
+ "enabledForDiskEncryption": false,
+ "enabledForTemplateDeployment": false,
+ "enableSoftDelete": false
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "AuditEvent",
+ "enabled": true
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "name": "[concat('acr', uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.ContainerRegistry/registries",
+ "apiVersion": "2019-12-01-preview",
+ "location": "[resourceGroup().location]",
+ "comments": "Container registry for storing docker images",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]"
+ ],
+ "tags": {
+ "displayName": "Container Registry",
+ "container.registry": "[concat('acr', uniqueString(resourceGroup().id))]"
+ },
+ "sku": {
+ "name": "Premium",
+ "tier": "Premium"
+ },
+ "properties": {
+ "adminUserEnabled": false,
+ "networkRuleSet": {
+ "defaultAction": "Deny"
+ },
+ "policies": {
+ "quarantinePolicy": {
+ "status": "disabled"
+ },
+ "trustPolicy": {
+ "type": "Notary",
+ "status": "disabled"
+ },
+ "retentionPolicy": {
+ "days": 15,
+ "status": "enabled"
+ }
+ },
+ "publicNetworkAccess": "Enabled",
+ "encryption": {
+ "status": "disabled"
+ },
+ "dataEndpointEnabled": true,
+ "networkRuleBypassOptions": "AzureServices"
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "dependsOn": [
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "metrics": [
+ {
+ "timeGrain": "PT1M",
+ "category": "AllMetrics",
+ "enabled": true
+ }
+ ],
+ "logs": [
+ {
+ "category": "ContainerRegistryRepositoryEvents",
+ "enabled": true
+ },
+ {
+ "category": "ContainerRegistryLoginEvents",
+ "enabled": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.ContainerService/managedClusters",
+ "apiVersion": "2021-09-01",
+ "name": "[concat('aks-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[variables('aksClusterUserDefinedManagedIdentityId')]": {}
+ }
+ },
+ "tags": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "Microsoft.Network/bastionHosts/[concat(parameters('aksClusterName'), 'Bastion')]",
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "Microsoft.Storage/storageAccounts/[concat('boot', uniquestring(resourceGroup().id))]",
+ "Microsoft.Network/applicationGateways/[concat('appgw-', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/KeyVaultPrivateEndpoint/vaultPrivateDnsZoneGroup",
+ "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/AcrPrivateEndpoint/registryPrivateDnsZoneGroup",
+ "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/BlobStorageAccountPrivateEndpoint/blobPrivateDnsZoneGroup",
+ "Microsoft.Authorization/roleAssignments/[guid(variables('aksClusterUserDefinedManagedIdentityId'), variables('contributorRoleId'), resourceGroup().id)]"
+ ],
+ "properties": {
+ "kubernetesVersion": "1.21.2",
+ "dnsPrefix": "[parameters('aksClusterName')]",
+ "sku": {
+ "name": "Basic",
+ "tier": "Paid"
+ },
+ "agentPoolProfiles": [
+ {
+ "name": "[tolower(parameters('systemNodePoolName'))]",
+ "count": 3,
+ "vmSize": "Standard_D16s_v3",
+ "osDiskSizeGB": 100,
+ "vnetSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AksSystemSubnet",
+ "podSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/PodSubnet",
+ "maxPods": 30,
+ "osType": "Linux",
+ "maxCount": 5,
+ "minCount": 3,
+ "scaleSetPriority": "Regular",
+ "scaleSetEvictionPolicy": "Delete",
+ "enableAutoScaling": true,
+ "mode": "System",
+ "type": "VirtualMachineScaleSets",
+ "availabilityZones": [],
+ "nodeLabels": {},
+ "nodeTaints": []
+ },
+ {
+ "name": "[tolower(parameters('userNodePoolName'))]",
+ "count": 3,
+ "vmSize": "Standard_D16s_v3",
+ "osDiskSizeGB": 100,
+ "vnetSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AksSystemSubnet",
+ "podSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/PodSubnet",
+ "maxPods": 30,
+ "osType": "Linux",
+ "maxCount": 5,
+ "minCount": 3,
+ "scaleSetPriority": "Regular",
+ "scaleSetEvictionPolicy": "Delete",
+ "enableAutoScaling": true,
+ "mode": "User",
+ "type": "VirtualMachineScaleSets",
+ "availabilityZones": [],
+ "nodeLabels": {},
+ "nodeTaints": []
+ }
+ ],
+ "linuxProfile": {
+ "adminUsername": "GEN-UNIQUE",
+ "ssh": {
+ "publicKeys": [
+ {
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "addonProfiles": {
+ "httpApplicationRouting": {
+ "enabled": false
+ },
+ "omsagent": {
+ "enabled": true,
+ "config": {
+ "logAnalyticsWorkspaceResourceID": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ }
+ },
+ "aciConnectorLinux": {
+ "enabled": false
+ },
+ "azurepolicy": {
+ "enabled": true,
+ "config": {
+ "version": "v2"
+ }
+ },
+ "kubeDashboard": {
+ "enabled": false
+ },
+ "ingressApplicationGateway": {
+ "config": {
+ "applicationGatewayId": "Microsoft.Network/applicationGateways/[concat('appgw-', uniqueString(resourceGroup().id))]"
+ },
+ "enabled": true,
+ "identity": {
+ "clientId": "[reference(variables('applicationGatewayUserDefinedManagedIdentityId')).clientId]",
+ "objectId": "[reference(variables('applicationGatewayUserDefinedManagedIdentityId')).principalId]",
+ "resourceId": "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('appgw-', uniqueString(resourceGroup().id))]ManagedIdentity"
+ }
+ }
+ },
+ "podIdentityProfile": {
+ "enabled": true
+ },
+ "enableRBAC": true,
+ "networkProfile": {
+ "networkPlugin": "azure",
+ "networkPolicy": "azure",
+ "podCidr": "10.244.0.0/16",
+ "serviceCidr": "10.3.0.0/16",
+ "dnsServiceIP": "10.3.0.10",
+ "dockerBridgeCidr": "172.17.0.1/16",
+ "outboundType": "userAssignedNATGateway",
+ "loadBalancerSku": "standard",
+ "loadBalancerProfile": "[json('null')]"
+ },
+ "aadProfile": {
+ "managed": true,
+ "enableAzureRBAC": true,
+ "adminGroupObjectIDs": [],
+ "tenantID": "[subscription().tenantId]"
+ },
+ "autoScalerProfile": {
+ "scan-interval": "10s",
+ "scale-down-delay-after-add": "10m",
+ "scale-down-delay-after-delete": "20s",
+ "scale-down-delay-after-failure": "3m",
+ "scale-down-unneeded-time": "10m",
+ "scale-down-unready-time": "20m",
+ "scale-down-utilization-threshold": "0.5",
+ "max-graceful-termination-sec": "600"
+ },
+ "apiServerAccessProfile": {
+ "enablePrivateCluster": false
+ }
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "dependsOn": [
+ "Microsoft.ContainerService/managedClusters/[concat('aks-', uniqueString(resourceGroup().id))]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "kube-apiserver",
+ "enabled": true
+ },
+ {
+ "category": "kube-audit",
+ "enabled": true
+ },
+ {
+ "category": "kube-audit-admin",
+ "enabled": true
+ },
+ {
+ "category": "kube-controller-manager",
+ "enabled": true
+ },
+ {
+ "category": "kube-scheduler",
+ "enabled": true
+ },
+ {
+ "category": "cluster-autoscaler",
+ "enabled": true
+ },
+ {
+ "category": "guard",
+ "enabled": true
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "PerNode"
+ },
+ "retentionInDays": 60
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "name": "ContainerInsights(, parameters(logAnalyticsWorkspaceName), )",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "microsoft.operationalinsights/workspaces/GEN-UNIQUE"
+ ],
+ "plan": {
+ "name": "ContainerInsights(, parameters(logAnalyticsWorkspaceName), )",
+ "promotionCode": "",
+ "product": "OMSGallery/ContainerInsights",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "microsoft.operationalinsights/workspaces/GEN-UNIQUE"
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "[variables('blobPrivateDnsZoneName')]",
+ "location": "global",
+ "properties": {
+ "maxNumberOfRecordSets": 25000,
+ "maxNumberOfVirtualNetworkLinks": 1000,
+ "maxNumberOfVirtualNetworkLinksWithRegistration": 100
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "location": "global",
+ "properties": {
+ "maxNumberOfRecordSets": 25000,
+ "maxNumberOfVirtualNetworkLinks": 1000,
+ "maxNumberOfVirtualNetworkLinksWithRegistration": 100
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "location": "global",
+ "properties": {
+ "maxNumberOfRecordSets": 25000,
+ "maxNumberOfVirtualNetworkLinks": 1000,
+ "maxNumberOfVirtualNetworkLinksWithRegistration": 100
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "[concat(variables('blobPrivateDnsZoneName'), '/link_to_', toLower(parameters('virtualNetworkName')))]",
+ "location": "global",
+ "dependsOn": [
+ "[variables('blobPrivateDnsZoneId')]",
+ "[variables('virtualNetworkId')]"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2018-09-01",
+ "name": "[concat(variables('keyVaultPrivateDnsZoneName'), '/link_to_', toLower(parameters('virtualNetworkName')))]",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "[concat(variables('acrPrivateDnsZoneName'), '/link_to_', toLower(parameters('virtualNetworkName')))]",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "BlobStorageAccountPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.Storage/storageAccounts/[concat('boot', uniquestring(resourceGroup().id))]"
+ ],
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "BlobStorageAccountPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.Storage/storageAccounts/[concat('boot', uniquestring(resourceGroup().id))]",
+ "groupIds": [
+ "blob"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ },
+ "resources": [
+ {
+ "type": "privateDnsZoneGroups",
+ "apiVersion": "2020-07-01",
+ "name": "blobPrivateDnsZoneGroup",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[variables('blobStorageAccountPrivateEndpointId')]",
+ "[variables('blobPrivateDnsZoneId')]",
+ "[variables('blobStorageAccountPrivateEndpointId')]"
+ ],
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "dnsConfig",
+ "properties": {
+ "privateDnsZoneId": "[variables('blobPrivateDnsZoneId')]"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "KeyVaultPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "KeyVaultPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "groupIds": [
+ "vault"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ },
+ "resources": [
+ {
+ "type": "privateDnsZoneGroups",
+ "apiVersion": "2020-07-01",
+ "name": "vaultPrivateDnsZoneGroup",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "Microsoft.Network/privateEndpoints/KeyVaultPrivateEndpoint"
+ ],
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "dnsConfig",
+ "properties": {
+ "privateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "AcrPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "AcrPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "groupIds": [
+ "registry"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ },
+ "resources": [
+ {
+ "condition": false,
+ "type": "privateDnsZoneGroups",
+ "apiVersion": "2020-07-01",
+ "name": "registryPrivateDnsZoneGroup",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "Microsoft.Network/privateEndpoints/AcrPrivateEndpoint"
+ ],
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "dnsConfig",
+ "properties": {
+ "privateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "microsoft.insights/activityLogAlerts",
+ "apiVersion": "2017-04-01",
+ "name": "AllAzureAdvisorAlert",
+ "location": "Global",
+ "properties": {
+ "scopes": [
+ "[resourceGroup().id]"
+ ],
+ "condition": {
+ "allOf": [
+ {
+ "field": "category",
+ "equals": "Recommendation"
+ },
+ {
+ "field": "operationName",
+ "equals": "Microsoft.Advisor/recommendations/available/action"
+ }
+ ]
+ },
+ "enabled": true,
+ "description": "All azure advisor alerts"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[variables('applicationGatewayPublicIPAddressName')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "type": "Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies",
+ "apiVersion": "2020-06-01",
+ "name": "[concat(parameters('applicationGatewayName'), 'WafPolicy')]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "customRules": [
+ {
+ "name": "BlockMe",
+ "priority": 1,
+ "ruleType": "MatchRule",
+ "action": "Block",
+ "matchConditions": [
+ {
+ "matchVariables": [
+ {
+ "variableName": "QueryString"
+ }
+ ],
+ "operator": "Contains",
+ "negationConditon": false,
+ "matchValues": [
+ "blockme"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "BlockEvilBot",
+ "priority": 2,
+ "ruleType": "MatchRule",
+ "action": "Block",
+ "matchConditions": [
+ {
+ "matchVariables": [
+ {
+ "variableName": "RequestHeaders",
+ "selector": "User-Agent"
+ }
+ ],
+ "operator": "Contains",
+ "negationConditon": false,
+ "matchValues": [
+ "evilbot"
+ ],
+ "transforms": [
+ "Lowercase"
+ ]
+ }
+ ]
+ }
+ ],
+ "policySettings": {
+ "requestBodyCheck": true,
+ "maxRequestBodySizeInKb": 128,
+ "fileUploadLimitInMb": 100,
+ "mode": "Prevention",
+ "state": "Enabled"
+ },
+ "managedRules": {
+ "managedRuleSets": [
+ {
+ "ruleSetType": "OWASP",
+ "ruleSetVersion": "3.1"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/applicationGateways",
+ "apiVersion": "2020-05-01",
+ "name": "[concat('appgw-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/publicIPAddresses/[concat('appgw-', uniqueString(resourceGroup().id))]PublicIp",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies/[concat(parameters('applicationGatewayName'), 'WafPolicy')]"
+ ],
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[variables('applicationGatewayUserDefinedManagedIdentityId')]": {}
+ }
+ },
+ "zones": [],
+ "properties": {
+ "sku": {
+ "name": "WAF_v2",
+ "tier": "WAF_v2"
+ },
+ "gatewayIPConfigurations": [
+ {
+ "name": "applicationGatewayIPConfiguration",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/ApplicationGatewaySubnet"
+ }
+ }
+ }
+ ],
+ "frontendIPConfigurations": [
+ {
+ "name": "applicationGatewayFrontendIPConfiguration",
+ "properties": {
+ "PublicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[concat('appgw-', uniqueString(resourceGroup().id))]PublicIp"
+ }
+ }
+ }
+ ],
+ "frontendPorts": [
+ {
+ "name": "applicationGatewayFrontendPort",
+ "properties": {
+ "Port": 80
+ }
+ }
+ ],
+ "autoscaleConfiguration": {
+ "minCapacity": 0,
+ "maxCapacity": 10
+ },
+ "enableHttp2": false,
+ "probes": [
+ {
+ "name": "defaultHttpProbe",
+ "properties": {
+ "protocol": "Http",
+ "path": "/",
+ "interval": 30,
+ "timeout": 30,
+ "unhealthyThreshold": 3,
+ "pickHostNameFromBackendHttpSettings": true,
+ "minServers": 0
+ }
+ },
+ {
+ "name": "defaultHttpsProbe",
+ "properties": {
+ "protocol": "Https",
+ "path": "/",
+ "interval": 30,
+ "timeout": 30,
+ "unhealthyThreshold": 3,
+ "pickHostNameFromBackendHttpSettings": true,
+ "minServers": 0
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "applicationGatewayBackendPool"
+ }
+ ],
+ "backendHttpSettingsCollection": [
+ {
+ "name": "applicationGatewayBackendHttpSettings",
+ "properties": {
+ "Port": 80,
+ "Protocol": "Http",
+ "CookieBasedAffinity": "Disabled"
+ }
+ }
+ ],
+ "httpListeners": [
+ {
+ "name": "applicationGatewayHttpListener",
+ "properties": {
+ "firewallPolicy": {
+ "id": "Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies/[concat(parameters('applicationGatewayName'), 'WafPolicy')]"
+ },
+ "FrontendIPConfiguration": {
+ "id": "Microsoft.Network/applicationGateways/frontendIPConfigurations/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayFrontendIPConfiguration"
+ },
+ "FrontendPort": {
+ "id": "Microsoft.Network/applicationGateways/frontendPorts/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayFrontendPort"
+ },
+ "Protocol": "Http"
+ }
+ }
+ ],
+ "requestRoutingRules": [
+ {
+ "Name": "default",
+ "properties": {
+ "RuleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayHttpListener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayBackendPool"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection/[concat('appgw-', uniqueString(resourceGroup().id))]/applicationGatewayBackendHttpSettings"
+ }
+ }
+ }
+ ],
+ "webApplicationFirewallConfiguration": {
+ "enabled": true,
+ "firewallMode": "Prevention",
+ "ruleSetType": "OWASP",
+ "ruleSetVersion": "3.1",
+ "requestBodyCheck": true,
+ "maxRequestBodySizeInKb": 128,
+ "fileUploadLimitInMb": 100
+ },
+ "firewallPolicy": {
+ "id": "Microsoft.Network/ApplicationGatewayWebApplicationFirewallPolicies/[concat(parameters('applicationGatewayName'), 'WafPolicy')]"
+ }
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "dependsOn": [
+ "Microsoft.Network/applicationGateways/[concat('appgw-', uniqueString(resourceGroup().id))]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "ApplicationGatewayAccessLog",
+ "enabled": true
+ },
+ {
+ "category": "ApplicationGatewayPerformanceLog",
+ "enabled": true
+ },
+ {
+ "category": "ApplicationGatewayFirewallLog",
+ "enabled": true
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "[guid(variables('applicationGatewayUserDefinedManagedIdentityId'), variables('contributorRoleId'), resourceGroup().id)]",
+ "dependsOn": [
+ "Microsoft.ContainerService/managedClusters/[concat('aks-', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/applicationGateways/[concat('appgw-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('contributorRoleDefinitionName'))]",
+ "principalId": "[reference(variables('aksClusterId'), '2020-12-01', 'Full').properties.addonProfiles.ingressApplicationGateway.identity.objectId]",
+ "principalType": "ServicePrincipal",
+ "scope": "[resourceGroup().id]"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT604 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT604
new file mode 100644
index 0000000..1422ca6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT604
@@ -0,0 +1,154 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/alert-to-queue-with-logic-app/azuredeploy.json",
+ "/demos/alert-to-queue-with-logic-app/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897836,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/alert-to-queue-with-logic-app/azuredeploy.json",
+ "/demos/alert-to-queue-with-logic-app/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT604",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT604",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name for the logic app."
+ },
+ "value": "AlertToQueue"
+ },
+ "serviceBusConnectionString": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The Azure Service Bus namespace connection string."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "serviceBusConnectionName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name for the Service Bus connection."
+ },
+ "value": "AlertQueue"
+ },
+ "serviceBusQueueName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the queue to add a message to."
+ },
+ "value": "myQueue"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "singleQuote": "'"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "location": "[resourceGroup().location]",
+ "name": "AlertQueue",
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'servicebus')]"
+ },
+ "displayName": "servicebus",
+ "parameterValues": {
+ "connectionString": "GEN-PASSWORD"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "AlertToQueue",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Web/connections/AlertQueue"
+ ],
+ "properties": {
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ }
+ },
+ "triggers": {
+ "manual": {
+ "type": "request",
+ "kind": "Http"
+ }
+ },
+ "actions": {
+ "Send_message": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "ContentData": "@{encodeBase64(triggerBody())}"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['servicebus']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/@{encodeURIComponent(, variables(singleQuote), parameters(serviceBusQueueName), variables(singleQuote), )}/messages"
+ }
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "servicebus": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'servicebus')]",
+ "connectionId": "Microsoft.Web/connections/AlertQueue"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "WebHookURI": {
+ "type": "string",
+ "value": "Use listCallbackURL(resourceId('Microsoft.Logic/workflows/triggers', parameter('logicAppName'), 'manual'), '2019-05-01').value to retrieve the URL. The value contains a secret."
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT605 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT605
new file mode 100644
index 0000000..ebc5428
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT605
@@ -0,0 +1,197 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/alert-to-slack-with-logic-app/azuredeploy.json",
+ "/demos/alert-to-slack-with-logic-app/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897852,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/alert-to-slack-with-logic-app/azuredeploy.json",
+ "/demos/alert-to-slack-with-logic-app/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT605",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT605",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name for the logic app."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "slackConnectionName": {
+ "type": "string",
+ "defaultValue": "SlackConnection",
+ "metadata": {
+ "description": "The name for the Slack connection."
+ },
+ "value": "slackConnection"
+ },
+ "slackChannel": {
+ "type": "string",
+ "defaultValue": "#general",
+ "metadata": {
+ "description": "The Slack channel to post to."
+ },
+ "value": "#general"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "location": "[resourceGroup().location]",
+ "name": "slackConnection",
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'slack')]"
+ },
+ "displayName": "slack"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "GEN-UNIQUE-8",
+ "dependsOn": [
+ "Microsoft.Web/connections/slackConnection"
+ ],
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ }
+ },
+ "triggers": {
+ "manual": {
+ "type": "request",
+ "kind": "Http",
+ "inputs": {
+ "schema": {
+ "properties": {
+ "context": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "portalLink": {
+ "type": "string"
+ },
+ "resourceName": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "portalLink",
+ "resourceName"
+ ],
+ "type": "object"
+ },
+ "status": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "status",
+ "context"
+ ],
+ "type": "object",
+ "\uff04schema": "http://json-schema.org/draft-04/schema#"
+ }
+ }
+ }
+ },
+ "actions": {
+ "Http": {
+ "type": "Http",
+ "inputs": {
+ "body": {
+ "longUrl": "@{triggerBody()['context']['portalLink']}"
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "method": "POST",
+ "uri": "https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyBkT1BRbA-uULHz8HMUAi0ywJtpNLXHShI"
+ }
+ },
+ "Post_Message": {
+ "type": "ApiConnection",
+ "inputs": {
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['slack']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/chat.postMessage",
+ "queries": {
+ "channel": "#general",
+ "text": "Azure Alert - '@{triggerBody()['context']['name']}' @{triggerBody()['status']} on '@{triggerBody()['context']['resourceName']}'. Details: @{body('Http')['id']}"
+ }
+ },
+ "runAfter": {
+ "Http": [
+ "Succeeded"
+ ]
+ }
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "slack": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'slack')]",
+ "connectionId": "Microsoft.Web/connections/slackConnection"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "WebHookURI": {
+ "type": "string",
+ "value": "Use 'listCallbackURL(resourceId('Microsoft.Logic/workflows/triggers', parameter('logicAppName'), 'manual'), '2019-05-01').value' to retrieve the callback URL, the value contains a secret and is not recommended in an output."
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT606 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT606
new file mode 100644
index 0000000..0c069e2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT606
@@ -0,0 +1,217 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/alert-to-text-message-with-logic-app/azuredeploy.json",
+ "/demos/alert-to-text-message-with-logic-app/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897877,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/alert-to-text-message-with-logic-app/azuredeploy.json",
+ "/demos/alert-to-text-message-with-logic-app/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT606",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT606",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name for the logic app."
+ },
+ "value": "AlertToText"
+ },
+ "twilioSid": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Your Twilio SID."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "twilioToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Your Twilio AuthToken."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "twilioConnectionName": {
+ "type": "string",
+ "defaultValue": "TwilioConnection",
+ "metadata": {
+ "description": "The name for the Twilio connection."
+ },
+ "value": "TwilioConnection"
+ },
+ "twilioAccountNumber": {
+ "type": "string",
+ "metadata": {
+ "description": "The Twilio number the message will send from."
+ },
+ "value": "+15551234567"
+ },
+ "toPhoneNumber": {
+ "type": "string",
+ "metadata": {
+ "description": "The phone number the message will send to."
+ },
+ "value": "5551234567"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "location": "[resourceGroup().location]",
+ "name": "TwilioConnection",
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'twilio')]"
+ },
+ "displayName": "twilio",
+ "parameterValues": {
+ "sid": "GEN-PASSWORD",
+ "token": "GEN-PASSWORD"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2016-06-01",
+ "name": "AlertToText",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Web/connections/TwilioConnection"
+ ],
+ "properties": {
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ }
+ },
+ "triggers": {
+ "manual": {
+ "type": "request",
+ "kind": "Http",
+ "inputs": {
+ "schema": {
+ "properties": {
+ "context": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "portalLink": {
+ "type": "string"
+ },
+ "resourceName": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "portalLink",
+ "resourceName"
+ ],
+ "type": "object"
+ },
+ "status": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "status",
+ "context"
+ ],
+ "type": "object",
+ "\uff04schema": "http://json-schema.org/draft-04/schema#"
+ }
+ }
+ }
+ },
+ "actions": {
+ "Http": {
+ "type": "Http",
+ "inputs": {
+ "body": {
+ "longUrl": "@{triggerBody()['context']['portalLink']}"
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "method": "POST",
+ "uri": "https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyBkT1BRbA-uULHz8HMUAi0ywJtpNLXHShI"
+ }
+ },
+ "Send_Message": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "body": "Azure Alert - '@{triggerBody()['context']['name']}' @{triggerBody()['status']} on '@{triggerBody()['context']['resourceName']}'. Details: @{body('Http')['id']}",
+ "from": "+15551234567",
+ "to": "5551234567"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['twilio']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/Messages.json"
+ },
+ "runAfter": {
+ "Http": [
+ "Succeeded"
+ ]
+ }
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "twilio": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'twilio')]",
+ "connectionId": "Microsoft.Web/connections/TwilioConnection"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT607 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT607
new file mode 100644
index 0000000..6cd2dc6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT607
@@ -0,0 +1,283 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/alsid-syslog-proxy/azuredeploy.json",
+ "/demos/alsid-syslog-proxy/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897887,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/alsid-syslog-proxy/azuredeploy.json",
+ "/demos/alsid-syslog-proxy/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT607",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT607",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "minLength": 1,
+ "type": "String",
+ "metadata": {
+ "description": "Hostname of the virtual machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminUserName": {
+ "minLength": 1,
+ "type": "String",
+ "metadata": {
+ "description": "User name of the administrator account of the virtual machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPassword": {
+ "type": "SecureString",
+ "metadata": {
+ "description": "Password of the administrator account of the virtual machine"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "defaultValue": "[concat('a', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "DNS Label for the Public IP. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "workspaceId": {
+ "type": "String",
+ "metadata": {
+ "description": "The ID of the log analytics workspace where you want to forward the logs. To find it, go to your workspace and you will have both the workspace ID and Primary key in the 'Agent management' tab."
+ },
+ "value": "GEN-GUID"
+ },
+ "primaryKey": {
+ "type": "String",
+ "metadata": {
+ "description": "The key to authenticate to the log analytics workspace where you want to forward the logs. To find it, go to your workspace and you will have both the workspace ID and Primary key in the 'Agent management' tab."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmUbuntuOSVersion": {
+ "defaultValue": "18.04-LTS",
+ "allowedValues": [
+ "12.04.5-LTS",
+ "14.04.2-LTS",
+ "15.04",
+ "18.04-LTS"
+ ],
+ "type": "String",
+ "metadata": {
+ "description": "Version of the Ubuntu OS."
+ }
+ },
+ "vmSize": {
+ "defaultValue": "Standard_A3",
+ "type": "String",
+ "metadata": {
+ "description": "Size of the virtual machine's disk"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location where resources should be deployed."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "vmImagePublisher": "Canonical",
+ "vmImageOffer": "UbuntuServer",
+ "vmNicName": "GEN-UNIQUENetworkInterface",
+ "netPrefix": "10.0.0.0/16",
+ "netSubnet1Name": "Subnet-1",
+ "netSubnet1Prefix": "10.0.0.0/24",
+ "netSubnet2Name": "Subnet-2",
+ "netSubnet2Prefix": "10.0.1.0/24",
+ "publicIPAddressName": "alsid-syslog-IP",
+ "setupScriptURI": "[uri(parameters('_artifactsLocation'), concat('scripts/setup.sh', parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//GEN-UNIQUENetworkInterface"
+ ],
+ "tags": {
+ "displayName": "vm"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE",
+ "adminUsername": "vmAdminUsername",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "vmOSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUENetworkInterface"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-06-01",
+ "type": "extensions",
+ "name": "config-app",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE"
+ ],
+ "tags": {
+ "displayName": "config-app"
+ },
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/setup.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "[concat('sudo sh setup.sh', parameters('workspaceId'), ' ', parameters('primaryKey'), ' ', parameters('_artifactsLocation'), ' ', reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.FQDN, ' ', parameters('_artifactsLocationSasToken'))]"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-06-01",
+ "name": "alsid-syslog-IP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAddressVersion": "IPv4",
+ "publicIPAllocationMethod": "Static",
+ "idleTimeoutInMinutes": 4,
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-06-01",
+ "name": "net",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "net"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ },
+ {
+ "name": "Subnet-2",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUENetworkInterface",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//net",
+ "Microsoft.Network/publicIPAddresses//alsid-syslog-IP"
+ ],
+ "tags": {
+ "displayName": "vmNic"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "publicIPAddress": {
+ "id": "[resourceId ('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"
+ },
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//net/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT608 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT608
new file mode 100644
index 0000000..7813e89
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT608
@@ -0,0 +1,335 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/anti-malware-extension-windows-vm/azuredeploy.json",
+ "/demos/anti-malware-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897922,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/anti-malware-extension-windows-vm/azuredeploy.json",
+ "/demos/anti-malware-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT608",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT608",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "Type of Storage"
+ }
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "metadata": {
+ "description": "Public IP Address Name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic",
+ "Static"
+ ],
+ "metadata": {
+ "description": "Public IP Address Type"
+ },
+ "value": "Dynamic"
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the VM"
+ },
+ "value": "julie"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the VM"
+ },
+ "value": "Standard_A2"
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "windows"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "VNET Name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "VNET address space"
+ }
+ },
+ "subnet1Name": {
+ "type": "string",
+ "defaultValue": "Subnet-1",
+ "metadata": {
+ "description": "Subnet 1 name"
+ }
+ },
+ "subnet1Prefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet 1 address space"
+ }
+ },
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the NIC"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmExtensionName": {
+ "type": "string",
+ "metadata": {
+ "description": "Extension name"
+ },
+ "value": "malware"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The region you wish to deploy your resources to"
+ }
+ }
+ },
+ "variables": {
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-07-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/GEN-UNIQUE",
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "julie",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/GEN-UNIQUE"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "julie",
+ "adminUsername": "windows",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "julie_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "julie/malware",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/julie"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Security",
+ "type": "IaaSAntimalware",
+ "typeHandlerVersion": "1.1",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "AntimalwareEnabled": true,
+ "Exclusions": {
+ "Paths": "C:\\Users",
+ "Extensions": ".txt",
+ "Processes": "taskmgr.exe"
+ },
+ "RealtimeProtectionEnabled": "true",
+ "ScheduledScanSettings": {
+ "isEnabled": "true",
+ "scanType": "Quick",
+ "day": "7",
+ "time": "120"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT609 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT609
new file mode 100644
index 0000000..3a70aea
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT609
@@ -0,0 +1,646 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/app-service-environment-azfirewall/nestedtemplates/vnet.json"
+ ],
+ "timestamp": 1642962897963,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/app-service-environment-azfirewall/nestedtemplates/vnet.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT609",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/azurefirewalls",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.network/routetables"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT609",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location (region) for all resources"
+ }
+ },
+ "vnetResourceName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the vnet"
+ }
+ },
+ "vnetAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "Address range of the virtual network"
+ }
+ },
+ "aseSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Subnet name that will contain the App Service Environment"
+ }
+ },
+ "aseSubnetAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "Address range that will be used by the App Service Environment"
+ }
+ },
+ "aseNSGName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the NSG for the App Service Environment"
+ }
+ },
+ "aseRouteTableName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the ASE Route Table"
+ }
+ },
+ "azureFirewallName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Azure Firewall"
+ }
+ },
+ "deployAzureFirewall": {
+ "type": "bool",
+ "metadata": {
+ "description": "Toggle whether to deploy the Azure Firewall"
+ }
+ },
+ "azureFirewallRouteTableName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Azure Firewall Route Table"
+ }
+ },
+ "azureFirewallSubnetAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "Address range that will be used by the Azure Firewall Subnet"
+ }
+ },
+ "azureFirewallPublicIP": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for the Azure Firewall public IP resource"
+ }
+ },
+ "tags": {
+ "type": "object",
+ "metadata": {
+ "description": "Resource Tags."
+ }
+ },
+ "aseSubnetServiceEndpoints": {
+ "type": "array",
+ "metadata": {
+ "description": "Service Endpoints enabled on the ASE subnet"
+ }
+ },
+ "azureMonitorFQDNs": {
+ "type": "array",
+ "metadata": {
+ "description": "FQDNs to whitelist for Azure Monitor"
+ }
+ },
+ "aseManagementIps": {
+ "type": "array",
+ "metadata": {
+ "description": "List of ASE management IPs"
+ }
+ }
+ },
+ "variables": {
+ "nsgId": "Microsoft.Network/networkSecurityGroups/aseNSGName",
+ "azureFirewallPrivateIpArray": "[split(parameters('azureFireWallSubnetAddressRange'),'.')]",
+ "azureFireWallPrivateIp": "[concat(variables('azureFirewallPrivateIpArray')[0],'.',variables('azureFirewallPrivateIpArray')[1],'.',variables('azureFirewallPrivateIpArray')[2],'.4')]",
+ "credentialAPIFQDN": "control-location.identity.azure.net"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-11-01",
+ "name": "aseNSGName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "AppServiceManagement",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "AppServiceManagement",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "ASE-internal-inbound",
+ "properties": {
+ "description": "ASE-internal-inbound",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "192.168.250.0/24",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-HTTP",
+ "properties": {
+ "description": "Allow HTTP",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-HTTPS",
+ "properties": {
+ "description": "Allow HTTPS",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-FTP",
+ "properties": {
+ "description": "Allow FTP over port 21",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-FTPS",
+ "properties": {
+ "description": "Allow FTPS",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "990",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-FTP-Data",
+ "properties": {
+ "description": "RDP",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10001-10020",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-Remote-Debugging",
+ "properties": {
+ "description": "Visual Studio remote debugging",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4016-4022",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Outbound-443",
+ "properties": {
+ "description": "Azure Storage blob",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-SMB",
+ "properties": {
+ "description": "Azure Storage queue",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "445",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DB",
+ "properties": {
+ "description": "Database",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "1433",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DB2",
+ "properties": {
+ "description": "Database 2",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "11000-11999",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DB3",
+ "properties": {
+ "description": "Database 3",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "14000-14999",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DNS",
+ "properties": {
+ "description": "DNS",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "53",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "ASE-internal-outbound",
+ "properties": {
+ "description": "Azure Storage queue",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "192.168.250.0/24",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-80",
+ "properties": {
+ "description": "Outbound 80",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "ASE-to-VNET",
+ "properties": {
+ "description": "ASE to VNET",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "192.168.250.0/23",
+ "access": "Allow",
+ "priority": 180,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/routeTables",
+ "apiVersion": "2020-11-01",
+ "name": "aseRouteTableName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "copy": [
+ {
+ "name": "routes",
+ "count": 30,
+ "input": {
+ "name": "[if(equals(copyIndex('routes'),0),'DefaultRoute',concat(parameters('aseManagementIps')[copyIndex('routes')],'-Route'))]",
+ "properties": {
+ "addressPrefix": "[if(equals(copyIndex('routes'),0),'0.0.0.0/0',concat(parameters('aseManagementIps')[copyIndex('routes')],'/32'))]",
+ "nextHopType": "[if(equals(copyIndex('routes'),0),'VirtualAppliance','Internet')]",
+ "nextHopIpAddress": "[if(equals(copyIndex('routes'),0),variables('azureFireWallPrivateIp'), json('null'))]"
+ }
+ }
+ }
+ ],
+ "disableBgpRoutePropagation": true
+ }
+ },
+ {
+ "type": "Microsoft.Network/routeTables",
+ "apiVersion": "2020-11-01",
+ "name": "azureFirewallRouteTableName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "routes": [
+ {
+ "name": "default-route",
+ "properties": {
+ "addressPrefix": "0.0.0.0/0",
+ "nextHopType": "Internet"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-11-01",
+ "name": "vnetResourceName",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/aseNSGName",
+ "Microsoft.Network/routeTables/aseRouteTableName",
+ "Microsoft.Network/routeTables/azureFirewallRouteTableName"
+ ],
+ "tags": "tags",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "vnetAddressRange"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "aseSubnetName",
+ "properties": {
+ "addressPrefix": "aseSubnetAddressRange",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/aseNSGName"
+ },
+ "routeTable": {
+ "id": "Microsoft.Network/routeTables/aseRouteTableName"
+ },
+ "serviceEndpoints": "aseSubnetServiceEndpoints"
+ }
+ },
+ {
+ "name": "AzureFirewallSubnet",
+ "properties": {
+ "addressPrefix": "azureFirewallSubnetAddressRange",
+ "routeTable": {
+ "id": "Microsoft.Network/routeTables/azureFirewallRouteTableName"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "condition": "deployAzureFirewall",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-11-01",
+ "name": "azureFirewallPublicIp",
+ "location": "location",
+ "sku": {
+ "name": "Standard"
+ },
+ "tags": "tags",
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "condition": "deployAzureFirewall",
+ "type": "Microsoft.Network/azureFirewalls",
+ "apiVersion": "2020-11-01",
+ "name": "azureFirewallName",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/vnetResourceName",
+ "Microsoft.Network/publicIpAddresses/azureFirewallPublicIP"
+ ],
+ "tags": "tags",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IpConf",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vnetResourceName/AzureFirewallSubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIpAddresses/azureFirewallPublicIP"
+ }
+ }
+ }
+ ],
+ "ApplicationRuleCollections": [
+ {
+ "Name": "AppServiceEnvironment",
+ "properties": {
+ "Priority": 500,
+ "Action": {
+ "Type": "Allow"
+ },
+ "Rules": [
+ {
+ "Name": "ASE",
+ "FqdnTags": [
+ "WindowsUpdate",
+ "AppServiceEnvironment"
+ ],
+ "Protocols": [
+ {
+ "ProtocolType": "Http",
+ "Port": 80
+ },
+ {
+ "ProtocolType": "Https",
+ "Port": 443
+ }
+ ]
+ },
+ {
+ "Name": "Managed Identity API",
+ "targetFqdns": [
+ "control-location.identity.azure.net"
+ ],
+ "protocols": [
+ {
+ "ProtocolType": "Https",
+ "Port": 443
+ }
+ ],
+ "sourceAddresses": [
+ "aseSubnetAddressRange"
+ ]
+ },
+ {
+ "Name": "AzureMonitorRules",
+ "targetFqdns": "azureMonitorFQDNs",
+ "protocols": [
+ {
+ "ProtocolType": "Https",
+ "Port": 443
+ }
+ ],
+ "sourceAddresses": [
+ "aseSubnetAddressRange"
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "NetworkRuleCollections": [
+ {
+ "Name": "Time-Diagnostics",
+ "properties": {
+ "Priority": 300,
+ "Action": {
+ "Type": "Allow"
+ },
+ "Rules": [
+ {
+ "Name": "Time",
+ "Protocols": [
+ "Any"
+ ],
+ "SourceAddresses": [
+ "*"
+ ],
+ "DestinationAddresses": [
+ "*"
+ ],
+ "DestinationPorts": [
+ "123"
+ ]
+ },
+ {
+ "Name": "Diagnostics",
+ "Protocols": [
+ "Any"
+ ],
+ "SourceAddresses": [
+ "*"
+ ],
+ "DestinationAddresses": [
+ "*"
+ ],
+ "DestinationPorts": [
+ "12000"
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "name": "AzMonitor",
+ "properties": {
+ "priority": 200,
+ "action": {
+ "type": "Allow"
+ },
+ "rules": [
+ {
+ "name": "AzMonitor",
+ "protocols": [
+ "TCP"
+ ],
+ "sourceAddresses": [
+ "*"
+ ],
+ "destinationAddresses": [
+ "AzureMonitor"
+ ],
+ "destinationPorts": [
+ "80",
+ "443",
+ "12000"
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT61 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT61
new file mode 100644
index 0000000..31fdb2a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT61
@@ -0,0 +1,159 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/database-new.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884419,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/database-new.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT61",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT61",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "value": "westus"
+ },
+ "newsqlServerName": {
+ "type": "string"
+ },
+ "existingSQLServerName": {
+ "type": "string"
+ },
+ "dbAdminName": {
+ "type": "string"
+ },
+ "dbAdminPassword": {
+ "type": "securestring"
+ },
+ "sqlDBName": {
+ "type": "string"
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {
+ "sql-api-version": "2014-04-01",
+ "sqldb-api-version": "2015-05-01-preview",
+ "sqlfirewallrules-api-version": "2014-04-01"
+ },
+ "resources": [
+ {
+ "name": "newsqlServerName",
+ "type": "Microsoft.Sql/servers",
+ "location": "westus",
+ "apiVersion": "2014-04-01",
+ "properties": {
+ "administratorLogin": "dbAdminName",
+ "administratorLoginPassword": "dbAdminPassword",
+ "version": "12.0"
+ },
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "trendmicroTags"
+ },
+ "resources": [
+ {
+ "name": "sqlDBName",
+ "type": "databases",
+ "location": "westus",
+ "apiVersion": "2015-05-01-preview",
+ "dependsOn": [
+ "Microsoft.Sql/servers/newsqlServerName"
+ ],
+ "properties": {
+ "edition": "Standard",
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "maxSizeBytes": "21474836480",
+ "requestedServiceObjectiveName": "S3"
+ }
+ },
+ {
+ "apiVersion": "2014-04-01",
+ "dependsOn": [
+ "Microsoft.Sql/servers/newsqlServerName"
+ ],
+ "location": "westus",
+ "name": "AllowAllAzureIps",
+ "properties": {
+ "endIpAddress": "0.0.0.0",
+ "startIpAddress": "0.0.0.0"
+ },
+ "type": "firewallrules"
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "sqlServerFQDN": {
+ "type": "string",
+ "value": "[reference(concat('Microsoft.Sql/servers/', parameters('newsqlServerName'))).fullyQualifiedDomainName]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT610 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT610
new file mode 100644
index 0000000..d78e508
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT610
@@ -0,0 +1,561 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/app-service-environment-azfirewall/azuredeploy.json",
+ "/demos/app-service-environment-azfirewall/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962897981,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/app-service-environment-azfirewall/azuredeploy.json",
+ "/demos/app-service-environment-azfirewall/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT610",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.web/sites",
+ "microsoft.web/hostingenvironments",
+ "microsoft.insights/components",
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT610",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location (region) for all resources. Use the location value, not the display name, e.g. eastus, not East US 2"
+ }
+ },
+ "aseName": {
+ "type": "string",
+ "defaultValue": "[concat('ASE', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the ASE resource"
+ }
+ },
+ "vnetResourceName": {
+ "type": "string",
+ "defaultValue": "virtualNetwork",
+ "metadata": {
+ "description": "The name of the vNet"
+ }
+ },
+ "applicationName": {
+ "type": "string",
+ "defaultValue": "application1",
+ "metadata": {
+ "description": "Name of the initial ASE App (without the FQDN)"
+ }
+ },
+ "internalLoadBalancingMode": {
+ "type": "int",
+ "defaultValue": 3,
+ "allowedValues": [
+ 0,
+ 3
+ ],
+ "metadata": {
+ "description": "0 = public VIP only, 1 = only ports 80/443 are mapped to ILB VIP, 2 = only FTP ports are mapped to ILB VIP, 3 = both ports 80/443 and FTP ports are mapped to an ILB VIP."
+ }
+ },
+ "aseSubnetName": {
+ "type": "string",
+ "defaultValue": "ase-subnet",
+ "metadata": {
+ "description": "Subnet name which will contain the App Service Environment"
+ }
+ },
+ "serverFarmsAseAspName": {
+ "type": "string",
+ "defaultValue": "ase-asp",
+ "metadata": {
+ "description": "Name of the app service"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "vnetAddressRange": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Address range for the virtual network in CIDR notation"
+ }
+ },
+ "aseSubnetAddressRange": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Address range for the ASE subnet in CIDR notation within the vnetAddress range"
+ }
+ },
+ "aseNSGName": {
+ "type": "string",
+ "defaultValue": "ase-NSG",
+ "metadata": {
+ "description": "Name for the NSG attached to the ASE subnet"
+ }
+ },
+ "aseRouteTableName": {
+ "type": "string",
+ "defaultValue": "ase-RouteTable",
+ "metadata": {
+ "description": "Name of the Route Table attached to the ASE subnet"
+ }
+ },
+ "azureFirewallName": {
+ "type": "string",
+ "defaultValue": "azFirewall",
+ "metadata": {
+ "description": "Name of the Azure Firewall"
+ }
+ },
+ "deployAzureFirewall": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Toggle whether to deploy the Azure Firewall"
+ }
+ },
+ "azureFirewallRouteTableName": {
+ "type": "string",
+ "defaultValue": "azFirewall-RouteTable",
+ "metadata": {
+ "description": "Name of the Azure Firewall Route Table"
+ }
+ },
+ "azureFirewallSubnetAddressRange": {
+ "type": "string",
+ "defaultValue": "10.0.1.0/24",
+ "metadata": {
+ "description": "Address range that will be used by the Azure Firewall Subnet within the vnetAddress range"
+ }
+ },
+ "azureFirewallPublicIP": {
+ "type": "string",
+ "defaultValue": "AzFirewall-pip",
+ "metadata": {
+ "description": "Name for the Azure Firewall public IP resource"
+ }
+ },
+ "tags": {
+ "type": "object",
+ "defaultValue": {},
+ "metadata": {
+ "description": "The collection of resource tags passed from parameters file"
+ },
+ "value": {
+ "tag1": "value1",
+ "tag2": "value2"
+ }
+ },
+ "aseSubnetServiceEndpoints": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Service Endpoints enabled on the ASE subnet"
+ },
+ "value": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ },
+ "aseManagementIps": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "List of ASE management IP addresses"
+ },
+ "value": [
+ "0.0.0.0",
+ "13.64.115.203",
+ "13.66.140.0",
+ "13.67.8.128",
+ "13.69.64.128",
+ "13.69.227.128",
+ "13.70.73.128",
+ "13.71.170.64",
+ "13.71.194.129",
+ "13.75.34.192",
+ "13.75.127.117",
+ "13.77.50.128",
+ "13.78.109.0",
+ "13.89.171.0",
+ "13.94.141.115",
+ "13.94.143.126",
+ "13.94.149.179",
+ "20.36.106.128",
+ "20.36.114.64",
+ "23.100.226.236",
+ "23.102.135.246",
+ "23.102.188.65",
+ "40.69.106.128",
+ "40.70.146.128",
+ "40.71.13.64",
+ "40.74.100.64",
+ "40.78.194.128",
+ "40.79.130.64",
+ "40.79.178.128",
+ "40.83.120.64",
+ "40.83.121.56",
+ "40.83.125.161",
+ "40.90.240.166",
+ "40.91.126.196",
+ "40.112.242.192",
+ "40.119.4.111",
+ "40.124.47.188",
+ "51.140.146.64",
+ "51.140.210.128",
+ "52.151.25.45",
+ "52.162.80.89",
+ "52.162.106.192",
+ "52.165.152.214",
+ "52.165.153.122",
+ "52.165.154.193",
+ "52.165.158.140",
+ "52.174.22.21",
+ "52.178.177.147",
+ "52.178.184.149",
+ "52.178.190.65",
+ "52.178.195.197",
+ "52.187.56.50",
+ "52.187.59.251",
+ "52.187.63.19",
+ "52.187.63.37",
+ "52.224.105.172",
+ "52.225.177.153",
+ "52.231.18.64",
+ "52.231.146.128",
+ "65.52.14.230",
+ "65.52.172.237",
+ "65.52.193.203",
+ "70.37.57.58",
+ "70.37.89.222",
+ "104.43.242.137",
+ "104.44.129.141",
+ "104.44.129.243",
+ "104.44.129.255",
+ "104.44.134.255",
+ "104.208.54.11",
+ "104.211.81.64",
+ "104.211.146.128",
+ "104.214.49.0",
+ "157.55.176.93",
+ "157.55.208.185",
+ "191.233.203.64",
+ "191.236.154.88"
+ ]
+ },
+ "azureMonitorFQDNs": {
+ "type": "array",
+ "metadata": {
+ "description": "FQDNs to whitelist for Azure Monitor"
+ },
+ "value": [
+ "dc.services.visualstudio.com",
+ "dc.applicationinsights.microsoft.com",
+ "rt.services.visualstudio.com",
+ "rt.applicationinsights.microsoft.com",
+ "agent.azureserviceprofiler.net",
+ "*.agent.azureserviceprofiler.net"
+ ]
+ }
+ },
+ "variables": {
+ "subnetId": "Microsoft.Network/virtualNetworks/subnets/virtualNetwork/ase-subnet",
+ "nestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "BuildOrUpdateASENetworking",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vnetResourceName": {
+ "value": "virtualNetwork"
+ },
+ "vnetAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "aseSubnetName": {
+ "value": "ase-subnet"
+ },
+ "aseSubnetAddressRange": {
+ "value": "10.0.0.0/24"
+ },
+ "aseNSGName": {
+ "value": "ase-NSG"
+ },
+ "aseRouteTableName": {
+ "value": "ase-RouteTable"
+ },
+ "azureFirewallName": {
+ "value": "azFirewall"
+ },
+ "azureFirewallSubnetAddressRange": {
+ "value": "10.0.1.0/24"
+ },
+ "azureFirewallRouteTableName": {
+ "value": "azFirewall-RouteTable"
+ },
+ "azureFirewallPublicIP": {
+ "value": "AzFirewall-pip"
+ },
+ "deployAzureFirewall": {
+ "value": true
+ },
+ "tags": {
+ "value": {
+ "tag1": "value1",
+ "tag2": "value2"
+ }
+ },
+ "aseSubnetServiceEndpoints": {
+ "value": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ },
+ "aseManagementIps": {
+ "value": [
+ "0.0.0.0",
+ "13.64.115.203",
+ "13.66.140.0",
+ "13.67.8.128",
+ "13.69.64.128",
+ "13.69.227.128",
+ "13.70.73.128",
+ "13.71.170.64",
+ "13.71.194.129",
+ "13.75.34.192",
+ "13.75.127.117",
+ "13.77.50.128",
+ "13.78.109.0",
+ "13.89.171.0",
+ "13.94.141.115",
+ "13.94.143.126",
+ "13.94.149.179",
+ "20.36.106.128",
+ "20.36.114.64",
+ "23.100.226.236",
+ "23.102.135.246",
+ "23.102.188.65",
+ "40.69.106.128",
+ "40.70.146.128",
+ "40.71.13.64",
+ "40.74.100.64",
+ "40.78.194.128",
+ "40.79.130.64",
+ "40.79.178.128",
+ "40.83.120.64",
+ "40.83.121.56",
+ "40.83.125.161",
+ "40.90.240.166",
+ "40.91.126.196",
+ "40.112.242.192",
+ "40.119.4.111",
+ "40.124.47.188",
+ "51.140.146.64",
+ "51.140.210.128",
+ "52.151.25.45",
+ "52.162.80.89",
+ "52.162.106.192",
+ "52.165.152.214",
+ "52.165.153.122",
+ "52.165.154.193",
+ "52.165.158.140",
+ "52.174.22.21",
+ "52.178.177.147",
+ "52.178.184.149",
+ "52.178.190.65",
+ "52.178.195.197",
+ "52.187.56.50",
+ "52.187.59.251",
+ "52.187.63.19",
+ "52.187.63.37",
+ "52.224.105.172",
+ "52.225.177.153",
+ "52.231.18.64",
+ "52.231.146.128",
+ "65.52.14.230",
+ "65.52.172.237",
+ "65.52.193.203",
+ "70.37.57.58",
+ "70.37.89.222",
+ "104.43.242.137",
+ "104.44.129.141",
+ "104.44.129.243",
+ "104.44.129.255",
+ "104.44.134.255",
+ "104.208.54.11",
+ "104.211.81.64",
+ "104.211.146.128",
+ "104.214.49.0",
+ "157.55.176.93",
+ "157.55.208.185",
+ "191.233.203.64",
+ "191.236.154.88"
+ ]
+ },
+ "azureMonitorFQDNs": {
+ "value": [
+ "dc.services.visualstudio.com",
+ "dc.applicationinsights.microsoft.com",
+ "rt.services.visualstudio.com",
+ "rt.applicationinsights.microsoft.com",
+ "agent.azureserviceprofiler.net",
+ "*.agent.azureserviceprofiler.net"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Web/hostingEnvironments",
+ "apiVersion": "2020-12-01",
+ "name": "[concat('ASE', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "kind": "ASEV2",
+ "tags": {
+ "displayName": "Deploy ASE"
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/BuildOrUpdateASENetworking"
+ ],
+ "properties": {
+ "name": "[concat('ASE', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "ipSslAddressCount": 0,
+ "internalLoadBalancingMode": 3,
+ "virtualNetwork": {
+ "Id": "Microsoft.Network/virtualNetworks/subnets/virtualNetwork/ase-subnet"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.web/serverfarms",
+ "apiVersion": "2020-12-01",
+ "name": "ase-asp",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "I1",
+ "tier": "Isolated"
+ },
+ "tags": {
+ "displayName": "Deploy App Service"
+ },
+ "kind": "app",
+ "properties": {
+ "name": "ase-asp",
+ "workerSize": "0",
+ "workerSizeId": "0",
+ "numberOfWorkers": "1",
+ "reserved": false,
+ "hostingEnvironment": "[concat('ASE', uniqueString(resourceGroup().id))]"
+ },
+ "dependsOn": [
+ "Microsoft.Web/hostingEnvironments/[concat('ASE', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2020-12-01",
+ "name": "application1",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Deploy Web App"
+ },
+ "kind": "app",
+ "properties": {
+ "enabled": true,
+ "serverFarmId": "Microsoft.Web/serverfarms/ase-asp",
+ "reserved": false,
+ "scmSiteAlsoStopped": false,
+ "hostingEnvironmentProfile": {
+ "id": "Microsoft.Web/hostingEnvironments/[concat('ASE', uniqueString(resourceGroup().id))]"
+ },
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false
+ },
+ "dependsOn": [
+ "Microsoft.Web/serverfarms/ase-asp",
+ "Microsoft.Web/hostingEnvironments/[concat('ASE', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "microsoft.insights/components",
+ "apiVersion": "2020-02-02-preview",
+ "name": "application1",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "applicationType": "web",
+ "displayName": "Deploy Application Insights"
+ },
+ "kind": "web",
+ "properties": {
+ "Application_Type": "web",
+ "Flow_Type": "Redfield",
+ "Request_Source": "AppServiceEnablementCreate"
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/BuildOrUpdateASENetworking"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT611 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT611
new file mode 100644
index 0000000..2aee4d0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT611
@@ -0,0 +1,331 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/application-gateway-demo-setup/azuredeploy.json",
+ "/demos/application-gateway-demo-setup/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898007,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/application-gateway-demo-setup/azuredeploy.json",
+ "/demos/application-gateway-demo-setup/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT611",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.resources/deployments",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/applicationgateways"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT611",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "size": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_Small",
+ "Standard_Medium",
+ "Standard_Large"
+ ],
+ "defaultValue": "Standard_Medium",
+ "metadata": {
+ "description": "Application Gateway size/SKU"
+ }
+ },
+ "capacity": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "Application Gateway instance number"
+ }
+ },
+ "cookieBasedAffinity": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "defaultValue": "Disabled",
+ "metadata": {
+ "description": "If cookie-based affinity is enabled the requests from the same client are hitting the same Web server"
+ },
+ "value": "Disabled"
+ },
+ "adminUsername": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "User name for the backend Web servers"
+ },
+ "value": "wsadmin"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the backend Web servers"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "applicationGatewayName": "applicationGateway1",
+ "publicIPAddressName": "testAppGWIP",
+ "virtualNetworkName": "virtualNetwork1",
+ "subnetName": "appGatewaySubnet",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/virtualNetwork1/appGatewaySubnet",
+ "publicIPRef": "Microsoft.Network/publicIPAddresses/testAppGWIP",
+ "backendDnsPrefix": "backend-",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/28",
+ "webServerTemplateName": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/apache/ubuntu-apache-test-page/azuredeploy.json",
+ "server1TestPage": "This is Server 1
",
+ "server2TestPage": "This is Server 2
",
+ "serverTestPageInfo": "Send next request. If Cookie-based affinity is enabled, clear the cookies to change the backend server.
Request headers:
$value){echo \"$h: $value
\n\";}?>
"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "webServer1",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//testAppGWIP"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/apache/ubuntu-apache-test-page/azuredeploy.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "wsadmin"
+ },
+ "authenticationType": {
+ "value": "password"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNameForPublicIP": {
+ "value": "[concat(variables('backendDnsPrefix'), uniqueString(reference(resourceId('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))).resourceGuid), '-1')]"
+ },
+ "testPageBody": {
+ "value": "This is Server 1
Send next request. If Cookie-based affinity is enabled, clear the cookies to change the backend server.
Request headers:
$value){echo \"$h: $value
\n\";}?>
"
+ },
+ "testPage": {
+ "value": "index.php"
+ },
+ "testPageTitle": {
+ "value": "Server 1"
+ },
+ "installPHP": {
+ "value": true
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "webServer2",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//testAppGWIP"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/apache/ubuntu-apache-test-page/azuredeploy.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "wsadmin"
+ },
+ "authenticationType": {
+ "value": "password"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNameForPublicIP": {
+ "value": "[concat(variables('backendDnsPrefix'), uniqueString(reference(resourceId('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))).resourceGuid), '-2')]"
+ },
+ "testPageBody": {
+ "value": "This is Server 2
Send next request. If Cookie-based affinity is enabled, clear the cookies to change the backend server.
Request headers:
$value){echo \"$h: $value
\n\";}?>
"
+ },
+ "testPage": {
+ "value": "index.php"
+ },
+ "testPageTitle": {
+ "value": "Server 2"
+ },
+ "installPHP": {
+ "value": true
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "testAppGWIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "virtualNetwork1",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "appGatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/28"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "name": "applicationGateway1",
+ "type": "Microsoft.Network/applicationGateways",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//virtualNetwork1",
+ "Microsoft.Network/publicIPAddresses//testAppGWIP",
+ "webServer1",
+ "webServer2"
+ ],
+ "properties": {
+ "sku": {
+ "name": "Standard_Medium",
+ "tier": "Standard",
+ "capacity": 2
+ },
+ "gatewayIPConfigurations": [
+ {
+ "name": "appGatewayIpConfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/virtualNetwork1/appGatewaySubnet"
+ }
+ }
+ }
+ ],
+ "frontendIPConfigurations": [
+ {
+ "name": "appGatewayFrontendIP",
+ "properties": {
+ "PublicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/testAppGWIP"
+ }
+ }
+ }
+ ],
+ "frontendPorts": [
+ {
+ "name": "appGatewayFrontendPort",
+ "properties": {
+ "Port": 80
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "appGatewayBackendPool",
+ "properties": {
+ "BackendAddresses": [
+ {
+ "IpAddress": "[reference('webServer1').outputs.fqdn.value]"
+ },
+ {
+ "IpAddress": "[reference('webServer2').outputs.fqdn.value]"
+ }
+ ]
+ }
+ }
+ ],
+ "backendHttpSettingsCollection": [
+ {
+ "name": "appGatewayBackendHttpSettings",
+ "properties": {
+ "Port": 80,
+ "Protocol": "Http",
+ "CookieBasedAffinity": "Disabled",
+ "requestTimeout": 30,
+ "requestRoutingRules": [
+ {
+ "id": "Microsoft.Network/applicationGateways/requestRoutingRules//applicationGateway1/rule1"
+ }
+ ]
+ }
+ }
+ ],
+ "httpListeners": [
+ {
+ "name": "appGatewayHttpListener",
+ "properties": {
+ "FrontendIPConfiguration": {
+ "Id": "Microsoft.Network/applicationGateways/frontendIPConfigurations//applicationGateway1/appGatewayFrontendIP"
+ },
+ "FrontendPort": {
+ "Id": "Microsoft.Network/applicationGateways/frontendPorts//applicationGateway1/appGatewayFrontendPort"
+ },
+ "Protocol": "Http"
+ }
+ }
+ ],
+ "requestRoutingRules": [
+ {
+ "Name": "rule1",
+ "properties": {
+ "RuleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners//applicationGateway1/appGatewayHttpListener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools//applicationGateway1/appGatewayBackendPool"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection//applicationGateway1/appGatewayBackendHttpSettings"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT612 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT612
new file mode 100644
index 0000000..3bf1804
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT612
@@ -0,0 +1,360 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/application-gateway-logviewer-goaccess/azuredeploy.json",
+ "/demos/application-gateway-logviewer-goaccess/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898022,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/application-gateway-logviewer-goaccess/azuredeploy.json",
+ "/demos/application-gateway-logviewer-goaccess/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT612",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT612",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username you want to use for the VM the template creates"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A2_v2",
+ "metadata": {
+ "description": "Size of the VM"
+ },
+ "value": "Standard_A2_v2"
+ },
+ "dnsNameForPublicIP": {
+ "type": "string",
+ "defaultValue": "[uniqueString(resourceGroup().id)]",
+ "metadata": {
+ "description": "The DNS name (prefix) you want to use for the VM to map against its public IP"
+ }
+ },
+ "appGwAccessLogsBlobSasUri": {
+ "type": "string",
+ "metadata": {
+ "description": "The SAS URL connection string for the storage account blog where your Application Gateway Access Logs are stored"
+ },
+ "value": "GEN-UNIQUE-24"
+ },
+ "filterRegexForAppGwAccessLogs": {
+ "type": "string",
+ "defaultValue": ".*",
+ "metadata": {
+ "description": "A regex to use to filter the Application Gateway Access Logs to a specific subset. For example, if you have multiple application gateways publishing logs to the same storage account blob, and you only want GoAccess to surface traffic stats for say one of the Application Gateways, you can provide a regex for this field to filter to just that instance."
+ },
+ "value": ".*"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "vmName": "[uniqueString(resourceGroup().id)]",
+ "nicName": "[uniqueString(resourceGroup().id)]_vmnic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/24",
+ "subnetName": "DefaultSubnet",
+ "publicIPAddressName": "[uniqueString(resourceGroup().id)]_publicip",
+ "virtualNetworkName": "[uniqueString(resourceGroup().id)]_vnet",
+ "networkSecurityGroupName": "[uniqueString(resourceGroup().id)]_nsg",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/[uniqueString(resourceGroup().id)]_vnet/DefaultSubnet",
+ "scriptFileUri": "[uri(parameters('_artifactsLocation'), concat('scripts/setup_vm.sh', parameters('_artifactsLocationSasToken')))]",
+ "appGatewayLogProcessorArtifactUri": "[uri(parameters('_artifactsLocation'), concat('scripts/AppGatewayLogProcessor.zip', parameters('_artifactsLocationSasToken')))]",
+ "appGwAccessLogsBlobSasUriVar": "\"GEN-UNIQUE-24\"",
+ "filterRegexForAppGwAccessLogsVar": "\"|.*|\"",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[uniqueString(resourceGroup().id)]_publicip",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[uniqueString(resourceGroup().id)]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-08-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[uniqueString(resourceGroup().id)]_nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 132,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http",
+ "properties": {
+ "provisioningState": "Succeeded",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 131,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "https",
+ "properties": {
+ "provisioningState": "Succeeded",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "GoAccessSocket",
+ "properties": {
+ "provisioningState": "Succeeded",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8080",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 129,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2018-08-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "[uniqueString(resourceGroup().id)]_vnet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "DefaultSubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2018-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[uniqueString(resourceGroup().id)]_vmnic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//[uniqueString(resourceGroup().id)]_publicip",
+ "Microsoft.Network/virtualNetworks//[uniqueString(resourceGroup().id)]_vnet",
+ "Microsoft.Network/networkSecurityGroups//[uniqueString(resourceGroup().id)]_nsg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[uniqueString(resourceGroup().id)]_publicip"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[uniqueString(resourceGroup().id)]_vnet/DefaultSubnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[uniqueString(resourceGroup().id)]_nsg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "[uniqueString(resourceGroup().id)]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//[uniqueString(resourceGroup().id)]_vmnic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "osProfile": {
+ "computerName": "[uniqueString(resourceGroup().id)]",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[uniqueString(resourceGroup().id)]_osdisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ },
+ "dataDisks": [
+ {
+ "name": "[uniqueString(resourceGroup().id)]_datadisk1",
+ "diskSizeGB": 1023,
+ "lun": 0,
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/[uniqueString(resourceGroup().id)]_vmnic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[uniqueString(resourceGroup().id)]/newuserscript",
+ "apiVersion": "2018-06-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//[uniqueString(resourceGroup().id)]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/setup_vm.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/AppGatewayLogProcessor.zip', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setup_vm.sh \"GEN-UNIQUE-24\" \"|.*|\""
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "goAccessReportUrl": {
+ "type": "string",
+ "value": "[concat(reference(variables('publicIPAddressName')).dnsSettings.fqdn, '/report.html')]"
+ },
+ "sshCommand": {
+ "type": "string",
+ "value": "[concat('ssh ', parameters('adminUsername'), '@', reference(variables('publicIPAddressName')).dnsSettings.fqdn)]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT613 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT613
new file mode 100644
index 0000000..cb852a5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT613
@@ -0,0 +1,211 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/arm-asm-s2s/azuredeploy.json",
+ "/demos/arm-asm-s2s/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898046,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/arm-asm-s2s/azuredeploy.json",
+ "/demos/arm-asm-s2s/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT613",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/localnetworkgateways",
+ "microsoft.network/virtualnetworkgateways"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT613",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "localGatewayName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for gateway connected to other VNet/on-prem network"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "localGatewayIpAddress": {
+ "type": "string",
+ "metadata": {
+ "description": "Public IP address for the gateway to connect to (from other VNet/on-prem)"
+ },
+ "value": "137.117.100.62"
+ },
+ "localGatewayAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "CIDR block for remote network"
+ },
+ "value": "10.1.0.0/16"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for new virtual network"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for new virtual network"
+ },
+ "value": "10.3.0.0/16"
+ },
+ "subnet1Name": {
+ "type": "string",
+ "defaultValue": "Subnet1",
+ "metadata": {
+ "description": "Name for VM subnet in the new VNet"
+ }
+ },
+ "gatewaySubnet": {
+ "type": "string",
+ "defaultValue": "GatewaySubnet",
+ "metadata": {
+ "description": "Name for gateway subnet in new VNet"
+ },
+ "allowedValues": [
+ "GatewaySubnet"
+ ]
+ },
+ "subnet1Prefix": {
+ "type": "string",
+ "metadata": {
+ "description": "CIDR block for VM subnet"
+ },
+ "value": "10.3.0.0/24"
+ },
+ "gatewaySubnetPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "CIDR block for gateway subnet"
+ },
+ "value": "10.3.200.0/29"
+ },
+ "gatewayPublicIPName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for public IP object used for the new gateway"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "gatewayName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for the new gateway"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location where resources reside."
+ }
+ }
+ },
+ "variables": {
+ "gatewaySubnetRef": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8/GatewaySubnet"
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-02-01",
+ "type": "Microsoft.Network/localNetworkGateways",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "localNetworkAddressSpace": {
+ "addressPrefixes": [
+ "10.1.0.0/16"
+ ]
+ },
+ "gatewayIpAddress": "137.117.100.62"
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.3.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet1",
+ "properties": {
+ "addressPrefix": "10.3.0.0/24"
+ }
+ },
+ {
+ "name": "GatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.3.200.0/29"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/virtualNetworkGateways",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//GEN-UNIQUE-8",
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8/GatewaySubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-8"
+ }
+ },
+ "name": "vnetGatewayConfig"
+ }
+ ],
+ "gatewayType": "Vpn",
+ "vpnType": "RouteBased",
+ "enableBgp": false
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT614 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT614
new file mode 100644
index 0000000..08e08be
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT614
@@ -0,0 +1,230 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/arm-template-retrieve-azure-storage-access-keys/azuredeploy.json",
+ "/demos/arm-template-retrieve-azure-storage-access-keys/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898057,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/arm-template-retrieve-azure-storage-access-keys/azuredeploy.json",
+ "/demos/arm-template-retrieve-azure-storage-access-keys/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT614",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.storage/storageaccounts",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT614",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('storage', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the Azure Storage account."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "storageAccountSku": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_GRS",
+ "Standard_RAGRS",
+ "Standard_ZRS",
+ "Premium_LRS",
+ "Premium_ZRS",
+ "Standard_GZRS",
+ "Standard_RAGZRS"
+ ],
+ "metadata": {
+ "description": "Sku on which to run the Azure Storage account."
+ }
+ },
+ "storageAccountKind": {
+ "type": "string",
+ "defaultValue": "StorageV2",
+ "allowedValues": [
+ "Storage",
+ "StorageV2",
+ "BlobStorage",
+ "FileStorage",
+ "BlockBlobStorage"
+ ],
+ "metadata": {
+ "description": "Indicates the type of storage account."
+ }
+ },
+ "storageAccountContainerName": {
+ "type": "string",
+ "defaultValue": "my-container",
+ "metadata": {
+ "description": "Set the name of the container to create in the Storage account."
+ }
+ },
+ "storageConnectionName": {
+ "type": "string",
+ "defaultValue": "[concat('storageconnection', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the Logic Apps API connection used to connect to the Azure Storage account."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "logicAppName": {
+ "type": "string",
+ "defaultValue": "[concat('logicapp', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the Logic App."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "logicAppPollingIntervalInMinutes": {
+ "type": "int",
+ "defaultValue": 30,
+ "metadata": {
+ "description": "The polling interval used to check for items on the Storage account."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location where resources reside."
+ }
+ },
+ "azureMgmtUri": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Azure Management URI"
+ },
+ "value": "https://management.azure.com:443/"
+ }
+ },
+ "variables": {
+ "storageAccountId": "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ ],
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azureblob')]"
+ },
+ "parameterValues": {
+ "accountName": "GEN-UNIQUE",
+ "accessKey": "[listKeys(variables('storageAccountId'), '2019-04-01').keys[0].value]"
+ },
+ "testLinks": [
+ {
+ "requestUri": "[uri(parameters('azureMgmtUri'), concat('subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Web/connections/', parameters('storageConnectionName'), '/extensions/proxy/testconnection?api-version=2018-07-01-preview'))]",
+ "method": "get"
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2019-04-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "properties": {
+ "accessTier": "Hot",
+ "supportsHttpsTrafficOnly": true
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Web/connections/GEN-UNIQUE"
+ ],
+ "properties": {
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ }
+ },
+ "triggers": {
+ "When_a_blob_is_added_or_modified_(properties_only)": {
+ "recurrence": {
+ "frequency": "Minute",
+ "interval": 30
+ },
+ "splitOn": "@triggerBody()",
+ "metadata": {
+ "JTJmbXktY29udGFpbmVy": "/my-container"
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azureblob']['connectionId']"
+ }
+ },
+ "method": "get",
+ "path": "/datasets/default/triggers/batch/onupdatedfile",
+ "queries": {
+ "folderId": "JTJmbXktY29udGFpbmVy",
+ "maxFileCount": 10
+ }
+ }
+ }
+ },
+ "actions": {
+ "Process_blobs": {
+ "type": "Scope"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azureblob": {
+ "connectionId": "Microsoft.Web/connections/GEN-UNIQUE",
+ "connectionName": "azureblob",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azureblob')]"
+ }
+ }
+ }
+ },
+ "state": "Enabled"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT615 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT615
new file mode 100644
index 0000000..b712de5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT615
@@ -0,0 +1,922 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/asr-automation-recovery/azuredeploy.json",
+ "/demos/asr-automation-recovery/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898085,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/asr-automation-recovery/azuredeploy.json",
+ "/demos/asr-automation-recovery/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT615",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts",
+ "microsoft.automation/automationaccounts/runbooks",
+ "microsoft.automation/automationaccounts/modules"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT615",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your Automation Account"
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "modulesUri": {
+ "type": "string",
+ "defaultValue": "https://devopsgallerystorage.blob.core.windows.net/packages/",
+ "metadata": {
+ "description": "Default modules URI"
+ }
+ },
+ "automationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "westcentralus",
+ "usgovvirginia",
+ "usgovtexas",
+ "usgovarizona"
+ ],
+ "metadata": {
+ "description": "Specify the region for your automation account"
+ },
+ "value": "westeurope"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "URI to artifacts location"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "assets": {
+ "aaVariables": {
+ "AzureSubscriptionId": {
+ "name": "AzureSubscriptionId",
+ "description": "Azure subscription Id"
+ }
+ }
+ },
+ "asrScripts": {
+ "runbooks": [
+ {
+ "name": "ASR-AddPublicIp",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddPublicIp.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable public IP on every VM in a Recovery Plan"
+ },
+ {
+ "name": "ASR-SQL-FailoverAG",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-SQL-FailoverAG.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to handle SQL Always On failover"
+ },
+ {
+ "name": "ASR-AddSingleNSGPublicIp",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddSingleNSGPublicIp.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable NSG and Public IP on every VM in a Recovery Plan"
+ },
+ {
+ "name": "ASR-AddSingleLoadBalancer",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddSingleLoadBalancer.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable a single Load Balancer for all the VMs in the recovery plan"
+ },
+ {
+ "name": "ASR-AddMulitpleLoadBalancers",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddMultipleLoadBalancers.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable multiple Load Balancers for selected VMs in the recovery plan"
+ },
+ {
+ "name": "ASR-DNS-UpdateIP",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-DNS-UpdateIP.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to update DNS for VMs within the recovery plan"
+ },
+ {
+ "name": "ASR-Wordpress-ChangeMysqlConfig",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-Wordpress-ChangeMysqlConfig.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to configure Mysql as part of a recovery plan"
+ },
+ {
+ "name": "ASR-SQL-FailoverAGClassic",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-SQL-FailoverAGClassic.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to failover SQL Availability Groups"
+ }
+ ],
+ "modules": [
+ {
+ "name": "AzureRm.Compute",
+ "url": "[uri(parameters('modulesUri'),'azurerm.compute.2.8.0.nupkg')]"
+ },
+ {
+ "name": "AzureRm.Resources",
+ "url": "[uri(parameters('modulesUri'),'azurerm.resources.3.7.0.nupkg')]"
+ },
+ {
+ "name": "AzureRm.Network",
+ "url": "[uri(parameters('modulesUri'),'azurerm.network.3.6.0.nupkg')]"
+ },
+ {
+ "name": "AzureRm.Automation",
+ "url": "[uri(parameters('modulesUri'),'azurerm.automation.1.0.3.nupkg')]"
+ }
+ ]
+ },
+ "azureRmProfile": {
+ "name": "AzureRm.Profile",
+ "url": "[uri(parameters('modulesUri'),'azurerm.profile.2.7.0.nupkg')]"
+ }
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-20",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2021-04-01",
+ "location": "westeurope",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "(assets).aaVariables.AzureSubscriptionId.name",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(assets).aaVariables.AzureSubscriptionId.description",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "GEN-UNIQUE-20/(azureRmProfile).name",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(azureRmProfile).url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "westeurope",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT616 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT616
new file mode 100644
index 0000000..8ca09d7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT616
@@ -0,0 +1,922 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/asr-automation-recovery/azuredeploy.json",
+ "/demos/asr-automation-recovery/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962898121,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/asr-automation-recovery/azuredeploy.json",
+ "/demos/asr-automation-recovery/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT616",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts",
+ "microsoft.automation/automationaccounts/runbooks",
+ "microsoft.automation/automationaccounts/modules"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT616",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your Automation Account"
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "modulesUri": {
+ "type": "string",
+ "defaultValue": "https://devopsgallerystorage.blob.core.windows.net/packages/",
+ "metadata": {
+ "description": "Default modules URI"
+ }
+ },
+ "automationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "westcentralus",
+ "usgovvirginia",
+ "usgovtexas",
+ "usgovarizona"
+ ],
+ "metadata": {
+ "description": "Specify the region for your automation account"
+ },
+ "value": "usgovarizona"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "URI to artifacts location"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "assets": {
+ "aaVariables": {
+ "AzureSubscriptionId": {
+ "name": "AzureSubscriptionId",
+ "description": "Azure subscription Id"
+ }
+ }
+ },
+ "asrScripts": {
+ "runbooks": [
+ {
+ "name": "ASR-AddPublicIp",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddPublicIp.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable public IP on every VM in a Recovery Plan"
+ },
+ {
+ "name": "ASR-SQL-FailoverAG",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-SQL-FailoverAG.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to handle SQL Always On failover"
+ },
+ {
+ "name": "ASR-AddSingleNSGPublicIp",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddSingleNSGPublicIp.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable NSG and Public IP on every VM in a Recovery Plan"
+ },
+ {
+ "name": "ASR-AddSingleLoadBalancer",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddSingleLoadBalancer.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable a single Load Balancer for all the VMs in the recovery plan"
+ },
+ {
+ "name": "ASR-AddMulitpleLoadBalancers",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-AddMultipleLoadBalancers.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable multiple Load Balancers for selected VMs in the recovery plan"
+ },
+ {
+ "name": "ASR-DNS-UpdateIP",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-DNS-UpdateIP.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to update DNS for VMs within the recovery plan"
+ },
+ {
+ "name": "ASR-Wordpress-ChangeMysqlConfig",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-Wordpress-ChangeMysqlConfig.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to configure Mysql as part of a recovery plan"
+ },
+ {
+ "name": "ASR-SQL-FailoverAGClassic",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/ASR-SQL-FailoverAGClassic.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to failover SQL Availability Groups"
+ }
+ ],
+ "modules": [
+ {
+ "name": "AzureRm.Compute",
+ "url": "[uri(parameters('modulesUri'),'azurerm.compute.2.8.0.nupkg')]"
+ },
+ {
+ "name": "AzureRm.Resources",
+ "url": "[uri(parameters('modulesUri'),'azurerm.resources.3.7.0.nupkg')]"
+ },
+ {
+ "name": "AzureRm.Network",
+ "url": "[uri(parameters('modulesUri'),'azurerm.network.3.6.0.nupkg')]"
+ },
+ {
+ "name": "AzureRm.Automation",
+ "url": "[uri(parameters('modulesUri'),'azurerm.automation.1.0.3.nupkg')]"
+ }
+ ]
+ },
+ "azureRmProfile": {
+ "name": "AzureRm.Profile",
+ "url": "[uri(parameters('modulesUri'),'azurerm.profile.2.7.0.nupkg')]"
+ }
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-20",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2021-04-01",
+ "location": "usgovarizona",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "(assets).aaVariables.AzureSubscriptionId.name",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(assets).aaVariables.AzureSubscriptionId.description",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "GEN-UNIQUE-20/(azureRmProfile).name",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(azureRmProfile).url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-01-13-preview",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "usgovarizona",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/modules//GEN-UNIQUE-20/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT617 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT617
new file mode 100644
index 0000000..8e210e0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT617
@@ -0,0 +1,583 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/asr-oms-monitoring/azuredeploy.json",
+ "/demos/asr-oms-monitoring/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898143,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/asr-oms-monitoring/azuredeploy.json",
+ "/demos/asr-oms-monitoring/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT617",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT617",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Create new or refer to an existing Log Analytic Workspace"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "ingestScheduleGuid": {
+ "type": "string",
+ "metadata": {
+ "description": "GUID for the schedule creation - create a unique before deploy"
+ },
+ "value": "GEN-GUID"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "psModulesUri": {
+ "type": "string",
+ "defaultValue": "https://devopsgallerystorage.blob.core.windows.net/packages/",
+ "metadata": {
+ "description": "Default modules URI"
+ },
+ "value": "https://devopsgallerystorage.blob.core.windows.net/packages/"
+ },
+ "omslogAnalyticsWorkspaceName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "omsautomationAccountName": {
+ "value": "GEN-UNIQUE-11"
+ }
+ },
+ "variables": {
+ "psModules": {
+ "azureRmProfile": {
+ "name": "AzureRm.Profile",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.profile.1.0.11.nupkg')]"
+ },
+ "azureRmResources": {
+ "name": "AzureRm.Resources",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.resources.2.0.2.nupkg')]"
+ },
+ "azureStorage": {
+ "name": "Azure.Storage",
+ "url": "[uri(parameters('psModulesUri'),'azure.storage.1.1.5.nupkg')]"
+ },
+ "azureRmStorage": {
+ "name": "AzureRm.Storage",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.storage.1.1.3.nupkg')]"
+ },
+ "azureRmOperationalInsights": {
+ "name": "AzureRm.OperationalInsights",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.operationalinsights.1.0.9.nupkg')]"
+ },
+ "azureRmSiteRecovery": {
+ "name": "AzureRm.SiteRecovery",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.siterecovery.1.1.10.nupkg')]"
+ },
+ "azureRmRecoveryServices": {
+ "name": "AzureRm.RecoveryServices",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.recoveryservices.1.1.3.nupkg')]"
+ },
+ "azureRmBackup": {
+ "name": "AzureRm.Backup",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.backup.1.0.9.nupkg')]"
+ },
+ "azureRmCompute": {
+ "name": "AzureRm.Compute",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.compute.1.3.3.nupkg')]"
+ },
+ "azureRmAutomation": {
+ "name": "AzureRm.Automation",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.automation.1.0.11.nupkg')]"
+ },
+ "omsASRMonitoring": {
+ "name": "OMSIngestionAPI",
+ "url": "https://github.com/krnese/AzureDeploy/raw/master/OMS/OMSIngestionAPI.zip"
+ }
+ },
+ "runbooks": {
+ "omsASRMonitoring": {
+ "name": "OMSASRMonitoring",
+ "version": "1.0.0.0",
+ "description": "Runbook to automatically ingest Recovery Services data and events into OMS Log Analytics",
+ "type": "PowerShell"
+ }
+ },
+ "ingestScheduleName": "IngestAPISchedule",
+ "ingestionScriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/OMSASRMonitoring.ps1', parameters('_artifactsLocationSasToken')))]",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "azureSubscriptionId": "AzureSubscriptionId",
+ "omsWorkspaceId": "OMSWorkspaceId",
+ "omsWorkspaceKey": "OMSWorkspacekey"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "[resourceGroup().location]",
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Microsoft-Windows-Hyper-V-VMMS-Admin",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsEvent",
+ "properties": {
+ "eventLogName": "Microsoft-Windows-Hyper-V-VMMS-Admin",
+ "eventTypes": [
+ {
+ "eventType": "Error"
+ },
+ {
+ "eventType": "Warning"
+ },
+ {
+ "eventType": "Information"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent1",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Average Replication Size"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent2",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Replication Throughput"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent3",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Network Send Throughput"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent4",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Replication Count"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent5",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Network Bytes Sent"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent6",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Last Replication Size"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent7",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Resynchronized Bytes"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "name": "omsAutomationAccountName",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "OMSWorkspaceId",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "OMS Workspace Id",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')),'2020-08-01').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "OMSWorkspacekey",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "OMS Workspace key",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2020-08-01').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "(psModules).azureRmOperationalInsights.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRMOperationalInsights.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmResources.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRMResources.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmAutomation.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules/omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules/omsAutomationAccountName/(psModules).azureRmResources.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRMAutomation.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmStorage.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmStorage.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureStorage.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureStorage.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmCompute.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmCompute.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmSiteRecovery.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRmSiteRecovery.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmbackup.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmBackup.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmRecoveryServices.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//GEN-UNIQUE-11/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmRecoveryServices.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmProfile.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmProfile.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).omsASRMonitoring.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).omsASRMonitoring.url"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).omsASRMonitoring.name",
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/variables//omsAutomationAccountName/AzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/variables//omsAutomationAccountName/OMSWorkspaceId",
+ "Microsoft.Automation/automationAccounts/variables//omsAutomationAccountName/OMSWorkspacekey",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmResources.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmCompute.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmStorage.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmRecoveryServices.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmSiteRecovery.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmBackup.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmOperationalInsights.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmAutomation.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).omsASRMonitoring.name"
+ ],
+ "properties": {
+ "runbookType": "(runbooks).omsASRMonitoring.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).omsASRMonitoring.description",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/OMSASRMonitoring.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "(runbooks).omsASRMonitoring.version"
+ }
+ }
+ },
+ {
+ "name": "omsAutomationAccountName/ingestscheduleName",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/runbooks//omsAutomationAccountName/(runbooks).omsASRMonitoring.name"
+ ],
+ "properties": {
+ "description": "OMS Ingestion API Scheduler",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "omsAutomationAccountName/IngestScheduleGuid",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/schedules//omsAutomationAccountName/ingestscheduleName",
+ "Microsoft.Automation/automationAccounts/runbooks//omsAutomationAccountName/(runbooks).omsASRMonitoring.name",
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "schedule": {
+ "name": "IngestAPISchedule"
+ },
+ "runbook": {
+ "name": "(Runbooks).omsASRMonitoring.name"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "AutomationAccontName": {
+ "value": "[concat('Microsoft.Automation/automationAccounts/', parameters('omsAutomationAccountName'))]",
+ "type": "string"
+ },
+ "LogAnalyticsworkspacename": {
+ "value": "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT618 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT618
new file mode 100644
index 0000000..4a28c37
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT618
@@ -0,0 +1,583 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/asr-oms-monitoring/azuredeploy.json",
+ "/demos/asr-oms-monitoring/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962898154,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/asr-oms-monitoring/azuredeploy.json",
+ "/demos/asr-oms-monitoring/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT618",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT618",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Create new or refer to an existing Log Analytic Workspace"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ },
+ "value": "usgovvirginia"
+ },
+ "ingestScheduleGuid": {
+ "type": "string",
+ "metadata": {
+ "description": "GUID for the schedule creation - create a unique before deploy"
+ },
+ "value": "GEN-GUID"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "psModulesUri": {
+ "type": "string",
+ "defaultValue": "https://devopsgallerystorage.blob.core.windows.net/packages/",
+ "metadata": {
+ "description": "Default modules URI"
+ }
+ },
+ "omslogAnalyticsWorkspaceName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "omsautomationAccountName": {
+ "value": "GEN-UNIQUE-11"
+ }
+ },
+ "variables": {
+ "psModules": {
+ "azureRmProfile": {
+ "name": "AzureRm.Profile",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.profile.1.0.11.nupkg')]"
+ },
+ "azureRmResources": {
+ "name": "AzureRm.Resources",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.resources.2.0.2.nupkg')]"
+ },
+ "azureStorage": {
+ "name": "Azure.Storage",
+ "url": "[uri(parameters('psModulesUri'),'azure.storage.1.1.5.nupkg')]"
+ },
+ "azureRmStorage": {
+ "name": "AzureRm.Storage",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.storage.1.1.3.nupkg')]"
+ },
+ "azureRmOperationalInsights": {
+ "name": "AzureRm.OperationalInsights",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.operationalinsights.1.0.9.nupkg')]"
+ },
+ "azureRmSiteRecovery": {
+ "name": "AzureRm.SiteRecovery",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.siterecovery.1.1.10.nupkg')]"
+ },
+ "azureRmRecoveryServices": {
+ "name": "AzureRm.RecoveryServices",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.recoveryservices.1.1.3.nupkg')]"
+ },
+ "azureRmBackup": {
+ "name": "AzureRm.Backup",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.backup.1.0.9.nupkg')]"
+ },
+ "azureRmCompute": {
+ "name": "AzureRm.Compute",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.compute.1.3.3.nupkg')]"
+ },
+ "azureRmAutomation": {
+ "name": "AzureRm.Automation",
+ "url": "[uri(parameters('psModulesUri'),'azurerm.automation.1.0.11.nupkg')]"
+ },
+ "omsASRMonitoring": {
+ "name": "OMSIngestionAPI",
+ "url": "https://github.com/krnese/AzureDeploy/raw/master/OMS/OMSIngestionAPI.zip"
+ }
+ },
+ "runbooks": {
+ "omsASRMonitoring": {
+ "name": "OMSASRMonitoring",
+ "version": "1.0.0.0",
+ "description": "Runbook to automatically ingest Recovery Services data and events into OMS Log Analytics",
+ "type": "PowerShell"
+ }
+ },
+ "ingestScheduleName": "IngestAPISchedule",
+ "ingestionScriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/OMSASRMonitoring.ps1', parameters('_artifactsLocationSasToken')))]",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "azureSubscriptionId": "AzureSubscriptionId",
+ "omsWorkspaceId": "OMSWorkspaceId",
+ "omsWorkspaceKey": "OMSWorkspacekey"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "usgovvirginia",
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Microsoft-Windows-Hyper-V-VMMS-Admin",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsEvent",
+ "properties": {
+ "eventLogName": "Microsoft-Windows-Hyper-V-VMMS-Admin",
+ "eventTypes": [
+ {
+ "eventType": "Error"
+ },
+ {
+ "eventType": "Warning"
+ },
+ {
+ "eventType": "Information"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent1",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Average Replication Size"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent2",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Replication Throughput"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent3",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Network Send Throughput"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent4",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Replication Count"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent5",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Network Bytes Sent"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent6",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Last Replication Size"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent7",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsLogAnalyticsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Resynchronized Bytes"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2021-04-01",
+ "location": "usgovvirginia",
+ "name": "omsAutomationAccountName",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "OMSWorkspaceId",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "OMS Workspace Id",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')),'2020-08-01').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "OMSWorkspacekey",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "OMS Workspace key",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2020-08-01').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "(psModules).azureRmOperationalInsights.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRMOperationalInsights.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmResources.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRMResources.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmAutomation.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules/omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules/omsAutomationAccountName/(psModules).azureRmResources.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRMAutomation.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmStorage.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmStorage.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureStorage.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureStorage.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmCompute.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmCompute.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmSiteRecovery.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRmSiteRecovery.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmbackup.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmBackup.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmRecoveryServices.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//GEN-UNIQUE-11/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmRecoveryServices.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmProfile.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmProfile.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).omsASRMonitoring.name",
+ "type": "Modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).omsASRMonitoring.url"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).omsASRMonitoring.name",
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/variables//omsAutomationAccountName/AzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/variables//omsAutomationAccountName/OMSWorkspaceId",
+ "Microsoft.Automation/automationAccounts/variables//omsAutomationAccountName/OMSWorkspacekey",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmResources.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmCompute.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureStorage.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmStorage.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmRecoveryServices.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmSiteRecovery.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmBackup.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmOperationalInsights.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).azureRmAutomation.name",
+ "Microsoft.Automation/automationAccounts/Modules//omsAutomationAccountName/(psModules).omsASRMonitoring.name"
+ ],
+ "properties": {
+ "runbookType": "(runbooks).omsASRMonitoring.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).omsASRMonitoring.description",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/OMSASRMonitoring.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "(runbooks).omsASRMonitoring.version"
+ }
+ }
+ },
+ {
+ "name": "omsAutomationAccountName/ingestscheduleName",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2021-04-01",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/runbooks//omsAutomationAccountName/(runbooks).omsASRMonitoring.name"
+ ],
+ "properties": {
+ "description": "OMS Ingestion API Scheduler",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "omsAutomationAccountName/IngestScheduleGuid",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2021-04-01",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/schedules//omsAutomationAccountName/ingestscheduleName",
+ "Microsoft.Automation/automationAccounts/runbooks//omsAutomationAccountName/(runbooks).omsASRMonitoring.name",
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "schedule": {
+ "name": "IngestAPISchedule"
+ },
+ "runbook": {
+ "name": "(Runbooks).omsASRMonitoring.name"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "AutomationAccontName": {
+ "value": "[concat('Microsoft.Automation/automationAccounts/', parameters('omsAutomationAccountName'))]",
+ "type": "string"
+ },
+ "LogAnalyticsworkspacename": {
+ "value": "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT619 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT619
new file mode 100644
index 0000000..de271ad
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT619
@@ -0,0 +1,883 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/asrRunbooks.json"
+ ],
+ "timestamp": 1642962898165,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/asrRunbooks.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT619",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts",
+ "microsoft.automation/automationaccounts/runbooks",
+ "microsoft.automation/automationaccounts/modules"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT619",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your Automation Account"
+ }
+ },
+ "automationRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the region for your automation account"
+ }
+ }
+ },
+ "variables": {
+ "assets": {
+ "aaVariables": {
+ "AzureSubscriptionId": {
+ "name": "AzureSubscriptionId",
+ "description": "Azure subscription Id"
+ }
+ }
+ },
+ "asrScripts": {
+ "runbooks": [
+ {
+ "name": "ASR-AddPublicIp",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-AddPublicIp.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable public IP on every VM in a Recovery Plan"
+ },
+ {
+ "name": "ASR-SQL-FailoverAG",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-SQL-FailoverAG.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to handle SQL Always On failover"
+ },
+ {
+ "name": "ASR-AddSingleNSGPublicIp",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-AddSingleNSGPublicIp.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable NSG and Public IP on every VM in a Recovery Plan"
+ },
+ {
+ "name": "ASR-AddSingleLoadBalancer",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-AddSingleLoadBalancer.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable a single Load Balancer for all the VMs in the recovery plan"
+ },
+ {
+ "name": "ASR-AddMulitpleLoadBalancers",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-AddMultipleLoadBalancers.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShell",
+ "description": "ASR Runbook to enable multiple Load Balancers for selected VMs in the recovery plan"
+ },
+ {
+ "name": "ASR-DNS-UpdateIP",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-DNS-UpdateIP.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to update DNS for VMs within the recovery plan"
+ },
+ {
+ "name": "ASR-Wordpress-ChangeMysqlConfig",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-Wordpress-ChangeMysqlConfig.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to configure Mysql as part of a recovery plan"
+ },
+ {
+ "name": "ASR-SQL-FailoverAGClassic",
+ "url": "[uri(deployment().properties.templateLink.uri, 'scripts/ASR-SQL-FailoverAGClassic.ps1')]",
+ "version": "1.0.0.0",
+ "type": "PowerShellWorkflow",
+ "description": "ASR Runbook to failover SQL Availability Group"
+ }
+ ],
+ "modules": [
+ {
+ "name": "AzureRm.Compute",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.compute.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Resources",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.resources.3.7.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Network",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.network.3.6.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Automation",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.automation.1.0.3.nupkg"
+ }
+ ]
+ },
+ "azureRmProfile": {
+ "name": "AzureRm.Profile",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.profile.2.7.0.nupkg"
+ }
+ },
+ "resources": [
+ {
+ "name": "automationAccountName",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2015-10-31",
+ "location": "automationRegion",
+ "properties": {
+ "sku": {
+ "name": "OMS"
+ }
+ },
+ "resources": [
+ {
+ "name": "(assets).aaVariables.AzureSubscriptionId.name",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/automationAccountName"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "(assets).aaVariables.AzureSubscriptionId.description",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').runbooks[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "(asrScripts).runbooks[copyIndex()].description",
+ "runbookType": "(asrScripts).runbooks[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": true,
+ "publishContentLink": {
+ "uri": "(asrScripts).runbooks[copyIndex()].url",
+ "version": "(asrScripts).runbooks[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "automationAccountName/(azureRmProfile).name",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(azureRmProfile).url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('asrScripts').modules[copyIndex()].Name)]",
+ "location": "automationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules//automationAccountName/(azureRmProfile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(asrScripts).modules[copyIndex()].url"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT62 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT62
new file mode 100644
index 0000000..b3b1eef
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT62
@@ -0,0 +1,311 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884434,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT62",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.hdinsight/clusters",
+ "microsoft.storage/storageaccounts",
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT62",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "clusterType": {
+ "type": "string",
+ "allowedValues": [
+ "hadoop",
+ "hbase",
+ "storm",
+ "spark"
+ ],
+ "metadata": {
+ "description": "The type of the HDInsight cluster to create."
+ },
+ "value": "hadoop"
+ },
+ "clusterName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the HDInsight cluster to create."
+ },
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterLoginUserName": {
+ "type": "string",
+ "metadata": {
+ "description": "These credentials can be used to submit jobs to the cluster and to log into cluster dashboards."
+ },
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "type": "string",
+ "metadata": {
+ "description": "These credentials can be used to remotely access the cluster."
+ },
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "clusterWorkerNodeCount": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "The number of nodes in the HDInsight cluster."
+ }
+ },
+ "storageAccount": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the storage account to use"
+ },
+ "value": "stgmsignite2016"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "westus",
+ "allowedValues": [
+ "westus",
+ "eastus",
+ "centralus"
+ ],
+ "metadata": {
+ "description": "Location where all the resources will be deployed"
+ },
+ "value": "westus"
+ },
+ "clusterVNetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the VirtualNetwork that the cluster need to bind to"
+ },
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "type": "string",
+ "metadata": {
+ "description": "The VNet subnet CIDR start address"
+ },
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "The VNet subnet CIDR address range"
+ },
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The VNet subnet Name of the HD cluster"
+ },
+ "value": "hdi-datameer-avyan-clustersubnet"
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ }
+ },
+ "variables": {
+ "storageAccountName": "stgmsignite2016",
+ "defaultApiVersion": "2018-02-01",
+ "clusterApiVersion": "2015-03-01-preview",
+ "clusterVNetName": "datameerP2PVnet",
+ "clusterVNetSubnetName": "hdi-datameer-avyan-clustersubnet",
+ "clusterVnetAddressSpace": "10.7.0.0/16",
+ "clusterVNetSubnetAddressRange": "10.7.4.0/24"
+ },
+ "resources": [
+ {
+ "name": "stgmsignite2016",
+ "type": "Microsoft.Storage/storageAccounts",
+ "location": "westus",
+ "apiVersion": "2018-02-01",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "dependsOn": [],
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "properties": {}
+ },
+ {
+ "name": "hdi-datameer-avyan-cluster",
+ "type": "Microsoft.HDInsight/clusters",
+ "location": "westus",
+ "apiVersion": "2015-03-01-preview",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/stgmsignite2016"
+ ],
+ "properties": {
+ "clusterVersion": "3.2",
+ "osType": "Linux",
+ "clusterDefinition": {
+ "kind": "hadoop",
+ "configurations": {
+ "gateway": {
+ "restAuthCredential.isEnabled": true,
+ "restAuthCredential.username": "hdiadmin",
+ "restAuthCredential.password": "GEN-PASSWORD"
+ }
+ }
+ },
+ "storageProfile": {
+ "storageaccounts": [
+ {
+ "name": "[replace(replace(concat(reference(concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), variables('defaultApiVersion')).primaryEndpoints.blob),'https:',''),'/','')]",
+ "isDefault": true,
+ "container": "hdi-datameer-avyan-cluster",
+ "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), variables('defaultApiVersion')).key1]"
+ }
+ ]
+ },
+ "computeProfile": {
+ "roles": [
+ {
+ "name": "headnode",
+ "targetInstanceCount": 2,
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "linuxOperatingSystemProfile": {
+ "username": "hdiuser",
+ "password": "GEN-PASSWORD"
+ }
+ },
+ "virtualNetworkProfile": {
+ "id": "Microsoft.Network/virtualNetworks/datameerP2PVnet",
+ "subnet": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/hdi-datameer-avyan-clustersubnet"
+ },
+ "scriptActions": []
+ },
+ {
+ "name": "workernode",
+ "targetInstanceCount": 2,
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "linuxOperatingSystemProfile": {
+ "username": "hdiuser",
+ "password": "GEN-PASSWORD"
+ }
+ },
+ "virtualNetworkProfile": {
+ "id": "Microsoft.Network/virtualNetworks/datameerP2PVnet",
+ "subnet": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/hdi-datameer-avyan-clustersubnet"
+ },
+ "scriptActions": []
+ },
+ {
+ "name": "zookeepernode",
+ "targetInstanceCount": 3,
+ "hardwareProfile": {
+ "vmSize": "Small"
+ },
+ "osProfile": {
+ "linuxOperatingSystemProfile": {
+ "username": "hdiuser",
+ "password": "GEN-PASSWORD"
+ }
+ },
+ "virtualNetworkProfile": {
+ "id": "Microsoft.Network/virtualNetworks/datameerP2PVnet",
+ "subnet": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/hdi-datameer-avyan-clustersubnet"
+ },
+ "scriptActions": []
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "name": "datameerdatameer_2016-08-12T19.37.23.326Z",
+ "apiVersion": "2015-01-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://gallery.azure.com/artifact/20151001/datameer.datameerdatameer.1.0.2/Artifacts/mainTemplate.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "galleryPackageIdentity": {
+ "value": "datameer.datameerdatameer.1.0.2"
+ },
+ "edgeNodeSize": {
+ "value": "Standard_D4_v3"
+ }
+ }
+ },
+ "dependsOn": [
+ "Microsoft.HDInsight/clusters/hdi-datameer-avyan-cluster"
+ ]
+ }
+ ],
+ "outputs": {
+ "cluster": {
+ "type": "object",
+ "value": "[reference(resourceId('Microsoft.HDInsight/clusters',parameters('clusterName')))]"
+ },
+ "datameerAppURL": {
+ "type": "string",
+ "value": "[concat('https://',parameters('clusterName'),'-dtu.apps.azurehdinsight.net:443')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT621 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT621
new file mode 100644
index 0000000..d3a1f82
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT621
@@ -0,0 +1,288 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/dscConfigs.json"
+ ],
+ "timestamp": 1642962898223,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/dscConfigs.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT621",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT621",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the Automation account"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "defaultValue": "West Europe",
+ "metadata": {
+ "description": "Specify the region for your Automation account"
+ }
+ },
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your existing OMS Automation account to store the configuration"
+ }
+ }
+ },
+ "variables": {
+ "assets": {
+ "psModules": {
+ "xPSDSC": {
+ "name": "xPSDesiredStateConfiguration",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/xpsdesiredstateconfiguration.3.9.0.nupkg"
+ }
+ },
+ "aaVariables": {
+ "OMSWorkspaceId": {
+ "name": "OMSWorkspaceId",
+ "description": "Workspace ID for the Log Analytics workspace"
+ },
+ "OMSWorkspaceKey": {
+ "name": "OMSWorkspaceKey",
+ "description": "Primary key for the Log Analytics workspace"
+ },
+ "AzureSubscriptionId": {
+ "name": "SubscriptionId",
+ "description": "Azure subscription Id"
+ }
+ },
+ "dsc": {
+ "omsConfig": {
+ "name": "OMS",
+ "description": "DSC configuration for installing and configuring OMS agent",
+ "uri": "[uri(deployment().properties.templateLink.uri, 'scripts/oms.ps1')]"
+ },
+ "omsService": {
+ "name": "OMSSERVICE",
+ "description": "DSC configuration for keeping the OMS agent in a running state",
+ "uri": "[uri(deployment().properties.templateLink.uri, 'scripts/omsservice.ps1')]"
+ },
+ "omsAsrComplete": {
+ "name": "OMSASR",
+ "description": "DSC configuration for installing the OMS and Azure agent for protected machines for ASR",
+ "uri": "[uri(deployment().properties.templateLink.uri, 'scripts/omsasr.ps1')]"
+ }
+ },
+ "guids": {
+ "guid1": "[guid(parameters('omsAutomationAccountName'))]",
+ "guid2": "[guid(parameters('omsWorkspaceName'))]",
+ "guid3": "[guid(resourceGroup().id, deployment().name)]"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2015-01-01-preview",
+ "location": "West Europe",
+ "properties": {
+ "sku": {
+ "name": "OMS"
+ }
+ },
+ "resources": [
+ {
+ "name": "(assets).aaVariables.OMSWorkspaceId.name",
+ "type": "variables",
+ "apiVersion": "2015-01-01-preview",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "(assets).aaVariables.OMSWorkspaceId.description",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "(assets).aaVariables.OMSWorkspaceKey.name",
+ "type": "variables",
+ "apiVersion": "2015-01-01-preview",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Remote file for the passphrase",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "(assets).aaVariables.AzureSubscriptionId.name",
+ "type": "variables",
+ "apiVersion": "2015-01-01-preview",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "(assets).aaVariables.AzureSubscriptionId.description",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "(assets).psModules.xPSDSC.name",
+ "type": "Modules",
+ "apiVersion": "2015-01-01-preview",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceKey.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.xPSDSC.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).dsc.omsConfig.name",
+ "type": "Configurations",
+ "apiVersion": "2015-01-01-preview",
+ "location": "West Europe",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Modules/(assets).psModules.xPSDSC.name"
+ ],
+ "properties": {
+ "logVerbose": false,
+ "description": "(assets).dsc.omsConfig.description",
+ "state": "Published",
+ "overwrite": "true",
+ "source": {
+ "type": "uri",
+ "value": "(assets).dsc.omsConfig.uri",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "name": "(assets).guids.guid1",
+ "type": "Compilationjobs",
+ "apiVersion": "2015-01-01-preview",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Configurations/(assets).dsc.omsConfig.name"
+ ],
+ "properties": {
+ "configuration": {
+ "name": "(assets).dsc.omsConfig.name"
+ }
+ }
+ },
+ {
+ "name": "(assets).dsc.omsAsrComplete.name",
+ "type": "Configurations",
+ "apiVersion": "2015-01-01-preview",
+ "location": "West Europe",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Modules/(assets).psModules.xPSDSC.name"
+ ],
+ "properties": {
+ "logVerbose": false,
+ "description": "(assets).dsc.omsAsrComplete.description",
+ "state": "Published",
+ "overwrite": "true",
+ "source": {
+ "type": "uri",
+ "value": "(assets).dsc.omsAsrComplete.uri",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "name": "(assets).guids.guid2",
+ "type": "Compilationjobs",
+ "apiVersion": "2015-01-01-preview",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Configurations/(assets).dsc.omsAsrComplete.name"
+ ],
+ "properties": {
+ "configuration": {
+ "name": "(assets).dsc.omsAsrComplete.name"
+ }
+ }
+ },
+ {
+ "name": "(assets).dsc.omsService.name",
+ "type": "Configurations",
+ "apiVersion": "2015-01-01-preview",
+ "location": "West Europe",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Variables/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Modules/(assets).psModules.xPSDSC.name"
+ ],
+ "properties": {
+ "logVerbose": false,
+ "description": "(assets).dsc.omsService.description",
+ "state": "Published",
+ "overwrite": "true",
+ "source": {
+ "type": "uri",
+ "Value": "(assets).dsc.omsService.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).guids.guid3",
+ "type": "Compilationjobs",
+ "apiVersion": "2015-01-01-preview",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/Configurations/(assets).dsc.omsService.name"
+ ],
+ "properties": {
+ "configuration": {
+ "name": "(assets).dsc.omsService.name"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT622 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT622
new file mode 100644
index 0000000..e474ded
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT622
@@ -0,0 +1,83 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/managedLinuxBackup.json"
+ ],
+ "timestamp": 1642962898233,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/managedLinuxBackup.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT622",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT622",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "instanceCount": {
+ "type": "int"
+ },
+ "vmNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Azure Virtual Machines"
+ }
+ },
+ "vmRgName": {
+ "type": "string"
+ },
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "Recovery services vault name where the VMs will be backed up to. The default vaule is 'Backup-vault'."
+ }
+ },
+ "omsRecoveryVaultRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the Backup Vault"
+ }
+ }
+ },
+ "variables": {
+ "backupFabric": "Azure",
+ "backupPolicy": "DefaultPolicy",
+ "v2VmType": "Microsoft.Compute/virtualMachines",
+ "v2VmContainer": "iaasvmcontainer;iaasvmcontainerv2;",
+ "v2Vm": "vm;iaasvmcontainerv2;"
+ },
+ "resources": [
+ {
+ "name": "omsRecoveryVaultName/Azure/iaasvmcontainer;iaasvmcontainerv2;vmRgName;vmNameSuffixVMcopyIndex()/vm;iaasvmcontainerv2;vmRgName;vmNameSuffixVMcopyIndex()",
+ "apiVersion": "2016-12-01",
+ "location": "omsRecoveryVaultRegion",
+ "type": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems",
+ "copy": {
+ "name": "iaasBackupCopy",
+ "count": "instanceCount"
+ },
+ "properties": {
+ "protectedItemType": "Microsoft.Compute/virtualMachines",
+ "policyId": "Microsoft.RecoveryServices/vaults/backupPolicies/omsRecoveryVaultName/DefaultPolicy",
+ "sourceResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('vmRgName'), '/providers/Microsoft.Compute/virtualMachines/', parameters('vmNameSuffix'), 'VM', copyIndex())]"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT623 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT623
new file mode 100644
index 0000000..41f8e1c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT623
@@ -0,0 +1,438 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/managedVms.json"
+ ],
+ "timestamp": 1642962898266,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/managedVms.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT623",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.resources/deployments",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT623",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "instanceCount": {
+ "type": "int",
+ "defaultValue": 2,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Specify the number of VMs to create"
+ }
+ },
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure Automation account name"
+ }
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "VM",
+ "metadata": {
+ "description": "Assing a prefix for the VMs you will create"
+ }
+ },
+ "platform": {
+ "type": "string",
+ "defaultValue": "WinSrv",
+ "allowedValues": [
+ "WinSrv",
+ "Linux"
+ ],
+ "metadata": {
+ "description": "Select the OS type to deploy"
+ }
+ },
+ "username": {
+ "type": "string",
+ "defaultValue": "azureadmin",
+ "metadata": {
+ "description": "User name for the OS."
+ }
+ },
+ "pwdOrSsh": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Provide pwd if WinSrv, SSH if Linux."
+ }
+ },
+ "omsResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify name of Resource Group containing the mgmt services"
+ }
+ },
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your OMS workspace"
+ }
+ },
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Recovery Vault"
+ }
+ },
+ "omsRecoveryVaultRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Recovery Vault region"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "availabilitySetName": "vmAvSet",
+ "vNetName": "managedVnet",
+ "vNetAddressPrefix": "192.168.0.0/16",
+ "subnetName": "subnet01",
+ "subnetAddressPrefix": "192.168.0.0/24",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/managedVnet/subnet01",
+ "windowsOffer": "WindowsServer",
+ "windowsSku": "2016-Datacenter",
+ "windowsPublisher": "MicrosoftWindowsServer",
+ "linuxOffer": "UbuntuServer",
+ "linuxSku": "12.04.5-LTS",
+ "linuxPublisher": "Canonical",
+ "windowsMgmtType": "MicrosoftMonitoringAgent",
+ "windowsMgmtVersion": "1.0",
+ "linuxMgmtType": "OmsAgentForLinux",
+ "linuxMgmtVersion": "1.4",
+ "modulesUrl": "[uri(deployment().properties.templateLink.uri, 'scripts/UpdateLCMforAAPull.zip')]",
+ "configurationFunction": "UpdateLCMforAAPull.ps1\\ConfigureLCMforAAPull",
+ "configurationMode": "ApplyAndMonitor",
+ "configurationModeFrequencyMins": 15,
+ "refreshFrequencyMins": 30,
+ "rebootNodeIfNeeded": true,
+ "actionAfterReboot": "ContinueConfiguration",
+ "allowModuleOverwrite": true,
+ "configName": "OMSSERVICE.localhost"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-04-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "VMIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "VMIP",
+ "count": "instancecount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(concat(parameters('vmNamePrefix'), 'VM', copyIndex()))]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-04-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "managedVnet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "192.168.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnet01",
+ "properties": {
+ "addressPrefix": "192.168.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-04-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "VMniccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "VMnic",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/VMIPcopyIndex()",
+ "Microsoft.Network/virtualNetworks/managedVnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/VMIPcopyIndex()"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/managedVnet/subnet01"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2017-03-30",
+ "name": "vmAvSet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 3
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "VMWinSrvcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "VM",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkinterfaces/VMniccopyIndex()",
+ "Microsoft.Compute/availabilitySets//vmAvSet"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets//vmAvSet"
+ },
+ "hardwareprofile": {
+ "vmsize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "VMWinSrvcopyIndex()",
+ "adminusername": "azureadmin",
+ "adminpassword": "pwdOrSsh"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "[if(equals(parameters('platform'), 'WinSrv'), variables('windowsPublisher'), variables('linuxPublisher'))]",
+ "offer": "[if(equals(parameters('platform'), 'WinSrv'), variables('windowsOffer'), variables('linuxOffer'))]",
+ "version": "latest",
+ "sku": "[if(equals(parameters('platform'), 'WinSrv'), variables('windowsSku'), variables('linuxSku'))]"
+ },
+ "osdisk": {
+ "name": "WinSrv-osDiskcopyIndex()",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ },
+ "caching": "ReadWrite"
+ }
+ },
+ "networkprofile": {
+ "networkinterfaces": [
+ {
+ "id": "Microsoft.Network/networkinterfaces/VMniccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2017-03-30",
+ "name": "VMWinSrvcopyIndex()/OMS",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "VMWinSrvOMS",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/VMWinSrvcopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.EnterpriseCloud.Monitoring",
+ "type": "[if(equals(parameters('platform'), 'WinSrv'), variables('windowsMgmtType'), variables('linuxMgmtType'))]",
+ "typeHandlerVersion": "[if(equals(parameters('platform'), 'WinSrv'), variables('windowsMgmtVersion'), variables('linuxMgmtVersion'))]",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "workspaceId": "[reference(resourceId(parameters('omsResourceGroup'), 'Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2015-11-01-preview').customerId]",
+ "azureResourceId": "Microsoft.Compute/virtualMachines//VMWinSrvcopyIndex()"
+ },
+ "protectedSettings": {
+ "workspaceKey": "[listKeys(resourceId(parameters('omsResourceGroup'),'Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2015-11-01-preview').primarySharedKey]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "VMWinSrvcopyIndex()/ServiceMap",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "VMWinSrvServiceMap",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/VMWinSrvcopyIndex()/extensions//OMS"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Monitoring.DependencyAgent",
+ "type": "[if(equals(parameters('platform'), 'WinSrv'), 'DependencyAgentWindows', 'DependencyAgentLinux')]",
+ "typeHandlerVersion": "9.1",
+ "autoUpgradeMinorVersion": true
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "VMWinSrvcopyIndex()/DSC",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "VMWinSrvDSC",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/VMWinSrvcopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "Items": {
+ "registrationKeyPrivate": "[listKeys(resourceId(parameters('omsResourceGroup'), 'Microsoft.Automation/automationAccounts/', parameters('automationAccountName')), '2015-01-01-preview').Keys[0].value]"
+ }
+ },
+ "settings": {
+ "ModulesUrl": "[uri(deployment().properties.templateLink.uri, 'scripts/UpdateLCMforAAPull.zip')]",
+ "SasToken": "",
+ "ConfigurationFunction": "UpdateLCMforAAPull.ps1\\ConfigureLCMforAAPull",
+ "Properties": [
+ {
+ "Name": "RegistrationKey",
+ "Value": {
+ "UserName": "PLACEHOLDER_DONOTUSE",
+ "Password": "PrivateSettingsRef:registrationKeyPrivate"
+ },
+ "TypeName": "System.Management.Automation.PSCredential"
+ },
+ {
+ "Name": "RegistrationUrl",
+ "Value": "[reference(resourceId(parameters('omsResourceGroup'), 'Microsoft.Automation/automationAccounts/', parameters('automationAccountName')), '2015-01-01-preview').registrationUrl]",
+ "TypeName": "System.String"
+ },
+ {
+ "Name": "NodeConfigurationName",
+ "Value": "OMSSERVICE.localhost",
+ "TypeName": "System.String"
+ },
+ {
+ "Name": "ConfigurationMode",
+ "Value": "ApplyAndMonitor",
+ "TypeName": "System.String"
+ },
+ {
+ "Name": "ConfigurationModeFrequencyMins",
+ "Value": 15,
+ "TypeName": "System.Int32"
+ },
+ {
+ "Name": "RefreshFrequencyMins",
+ "Value": 30,
+ "TypeName": "System.Int32"
+ },
+ {
+ "Name": "RebootNodeIfNeeded",
+ "Value": true,
+ "TypeName": "System.Boolean"
+ },
+ {
+ "Name": "ActionAfterReboot",
+ "Value": "ContinueConfiguration",
+ "TypeName": "System.String"
+ },
+ {
+ "Name": "AllowModuleOverwrite",
+ "Value": true,
+ "TypeName": "System.Boolean"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-05-10",
+ "type": "Microsoft.Resources/deployments",
+ "resourceGroup": "omsResourceGroup",
+ "name": "enableBackup",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/VMWinSrv0/extensions/OMS"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, 'managedVmsBackup.json')]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "instanceCount": {
+ "value": 2
+ },
+ "vmNamePrefix": {
+ "value": "VM"
+ },
+ "vmRgName": {
+ "value": "[resourceGroup().name]"
+ },
+ "omsRecoveryVaultName": {
+ "value": "omsRecoveryVaultName"
+ },
+ "omsRecoveryVaultRegion": {
+ "value": "omsRecoveryVaultRegion"
+ },
+ "platform": {
+ "value": "WinSrv"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT624 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT624
new file mode 100644
index 0000000..c43dee5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT624
@@ -0,0 +1,93 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/managedVmsBackup.json"
+ ],
+ "timestamp": 1642962898275,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/managedVmsBackup.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT624",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT624",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "instanceCount": {
+ "type": "int"
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Azure Virtual Machines"
+ }
+ },
+ "vmRgName": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource group containing the virtual machines."
+ }
+ },
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "Recovery services vault name where the VMs will be backed up to. The default vaule is 'Backup-vault'."
+ }
+ },
+ "omsRecoveryVaultRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the Backup Vault"
+ }
+ },
+ "platform": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify OS platform"
+ }
+ }
+ },
+ "variables": {
+ "backupFabric": "Azure",
+ "backupPolicy": "DefaultPolicy",
+ "v2VmType": "Microsoft.Compute/virtualMachines",
+ "v2VmContainer": "iaasvmcontainer;iaasvmcontainerv2;",
+ "v2Vm": "vm;iaasvmcontainerv2;"
+ },
+ "resources": [
+ {
+ "name": "omsRecoveryVaultName/Azure/iaasvmcontainer;iaasvmcontainerv2;vmRgName;vmNamePrefixplatformcopyIndex()/vm;iaasvmcontainerv2;vmRgName;vmNamePrefixplatformcopyIndex()",
+ "apiVersion": "2016-12-01",
+ "location": "omsRecoveryVaultRegion",
+ "type": "Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems",
+ "copy": {
+ "name": "iaasBackupCopy",
+ "count": "instanceCount"
+ },
+ "properties": {
+ "protectedItemType": "Microsoft.Compute/virtualMachines",
+ "policyId": "Microsoft.RecoveryServices/vaults/backupPolicies/omsRecoveryVaultName/DefaultPolicy",
+ "sourceResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('vmRgName'), '/providers/Microsoft.Compute/virtualMachines/', parameters('vmNamePrefix'), parameters('platform'), copyIndex())]"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT625 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT625
new file mode 100644
index 0000000..59ad288
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT625
@@ -0,0 +1,303 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/mgmtDashboards.json"
+ ],
+ "timestamp": 1642962898283,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/mgmtDashboards.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT625",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.portal/dashboards"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT625",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmResourceGroup": {
+ "type": "string"
+ },
+ "omsAutomationAccountName": {
+ "type": "string"
+ },
+ "omsRecoveryVaultName": {
+ "type": "string"
+ },
+ "omsWorkspaceName": {
+ "type": "string"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Portal/dashboards",
+ "apiVersion": "2015-08-01-preview",
+ "location": "[resourceGroup().location]",
+ "name": "[concat('AzureMgmt', resourceGroup().name, '-dashboard')]",
+ "properties": {
+ "lenses": {
+ "0": {
+ "order": 0,
+ "parts": {
+ "0": {
+ "position": {
+ "x": 0,
+ "y": 0,
+ "rowSpan": 4,
+ "colSpan": 6
+ },
+ "metadata": {
+ "inputs": [],
+ "type": "Extension[azure]/HubsExtension/PartType/MarkdownPart",
+ "settings": {
+ "content": {
+ "settings": {
+ "content": "### Demo environment for Azure mgmt!\r\n\r\nThis dashboard contains pointers to all mgmt services and workloads.\r\n\r\nFeedback/questions:\r\n\r\nkrnese@microsoft.com \r\n\r\n\r\n",
+ "title": "Azure Management",
+ "subtitle": ""
+ }
+ }
+ }
+ }
+ },
+ "1": {
+ "position": {
+ "x": 6,
+ "y": 0,
+ "rowSpan": 4,
+ "colSpan": 4
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "resourceGroup",
+ "value": "[resourceGroup().id]"
+ }
+ ],
+ "type": "Extension/HubsExtension/PartType/ResourceGroupMapPinnedPart",
+ "asset": {
+ "idInputName": "resourceGroup",
+ "type": "ResourceGroups"
+ },
+ "defaultMenuItemId": "overview"
+ }
+ },
+ "2": {
+ "position": {
+ "x": 0,
+ "y": 4,
+ "rowSpan": 2,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "resourceId",
+ "value": "Microsoft.RecoveryServices/vaults//omsRecoveryVaultName"
+ }
+ ],
+ "type": "Extension/Microsoft_Azure_RecoveryServices/PartType/ResourcePart",
+ "asset": {
+ "idInputName": "resourceId",
+ "type": "RecoveryServicesResource"
+ },
+ "defaultMenuItemId": "overview"
+ }
+ },
+ "3": {
+ "position": {
+ "x": 2,
+ "y": 4,
+ "rowSpan": 2,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "inferredBladePinPartInputs.id",
+ "value": "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ },
+ {
+ "name": "accountResourceId",
+ "value": "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ }
+ ],
+ "type": "Extension/Microsoft_Azure_Automation/PartType/InferredBladePinPartAccountDashboardBlade",
+ "asset": {
+ "idInputName": "accountResourceId",
+ "type": "Account"
+ },
+ "defaultMenuItemId": "overview"
+ }
+ },
+ "4": {
+ "position": {
+ "x": 4,
+ "y": 4,
+ "rowSpan": 2,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "id",
+ "value": "Microsoft.OperationalInsights/workspaces//omsWorkspaceName"
+ }
+ ],
+ "type": "Extension/Microsoft_OperationsManagementSuite_Workspace/PartType/WorkspacePart",
+ "asset": {
+ "idInputName": "id",
+ "type": "Workspace"
+ },
+ "defaultMenuItemId": "Overview"
+ }
+ },
+ "5": {
+ "position": {
+ "x": 6,
+ "y": 4,
+ "rowSpan": 4,
+ "colSpan": 4
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "resourceGroup",
+ "value": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('vmResourceGroup'))]"
+ }
+ ],
+ "type": "Extension/HubsExtension/PartType/ResourceGroupMapPinnedPart",
+ "asset": {
+ "idInputName": "resourceGroup",
+ "type": "ResourceGroups"
+ },
+ "defaultMenuItemId": "overview"
+ }
+ },
+ "6": {
+ "position": {
+ "x": 0,
+ "y": 6,
+ "rowSpan": 2,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "resourceId",
+ "value": "Microsoft.RecoveryServices/vaults//omsRecoveryVaultName"
+ }
+ ],
+ "type": "Extension/Microsoft_Azure_RecoveryServices/Blade/ResourceBlade/Lens/BackupItemsLens/PartInstance/BackupProtectedItemsSummaryPart"
+ }
+ },
+ "7": {
+ "position": {
+ "x": 2,
+ "y": 6,
+ "rowSpan": 1,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "accountResourceId",
+ "value": "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ }
+ ],
+ "type": "Extension/Microsoft_Azure_Automation/Blade/AccountDashboardBlade/Lens/ResourcesLens/PartInstance/RunbooksCollectionPart"
+ }
+ },
+ "8": {
+ "position": {
+ "x": 4,
+ "y": 6,
+ "rowSpan": 1,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "id",
+ "value": "Microsoft.OperationalInsights/workspaces//omsWorkspaceName"
+ }
+ ],
+ "type": "Extension/Microsoft_OperationsManagementSuite_Workspace/Blade/WorkspaceBlade/Lens/ManagementLens/PartInstance/LogSearchPart"
+ }
+ },
+ "9": {
+ "position": {
+ "x": 2,
+ "y": 7,
+ "rowSpan": 1,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "accountResourceId",
+ "value": "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ }
+ ],
+ "type": "Extension/Microsoft_Azure_Automation/Blade/AccountDashboardBlade/Lens/ResourcesLens/PartInstance/DsConfigurationsCollectionPart",
+ "asset": {
+ "idInputName": "accountResourceId",
+ "type": "Account"
+ }
+ }
+ },
+ "10": {
+ "position": {
+ "x": 4,
+ "y": 7,
+ "rowSpan": 1,
+ "colSpan": 2
+ },
+ "metadata": {
+ "inputs": [
+ {
+ "name": "id",
+ "value": "Microsoft.OperationalInsights/workspaces//omsWorkspaceName"
+ }
+ ],
+ "type": "Extension/Microsoft_OperationsManagementSuite_Workspace/Blade/WorkspaceBlade/Lens/ManagementLens/PartInstance/OverviewPart"
+ }
+ }
+ }
+ }
+ },
+ "metadata": {
+ "model": {
+ "timeRange": {
+ "value": {
+ "relative": {
+ "duration": 24,
+ "timeUnit": 1
+ }
+ },
+ "type": "MsPortalFx.Composition.Configuration.ValueTypes.TimeRange"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT626 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT626
new file mode 100644
index 0000000..a9a6cf0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT626
@@ -0,0 +1,200 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/omsAutomation.json"
+ ],
+ "timestamp": 1642962898295,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/omsAutomation.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT626",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT626",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the Automation account"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the region for your Automation account"
+ }
+ },
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the OMS workspace"
+ }
+ },
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the ASR Recovery Vault"
+ }
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "omsABUscript": {
+ "name": "AzureIaasBackup",
+ "version": "1.0.0.0",
+ "description": "Runbook to automatically backup IaaS VMs within the ABU region",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "scriptUri": "[uri(deployment().properties.templateLink.uri, 'scripts/Automated-IaaS-Backup.ps1')]",
+ "azureSubscriptionId": "AzureSubscriptionId",
+ "omsWorkspaceId": "OMSWorkspaceId",
+ "omsWorkspaceKey": "OMSWorkspacekey",
+ "omsWorkspaceNameAsset": "OMSWorkspaceName",
+ "omsResourceGroupName": "OMSResourceGroupName",
+ "omsRecoveryVault": "OMSRecoveryVault"
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "name": "",
+ "type": "Microsoft.Automation/automationAccounts",
+ "comments": "Automation account for OMS",
+ "properties": {
+ "sku": {
+ "name": "OMS"
+ }
+ },
+ "resources": [
+ {
+ "name": "OMSWorkspaceId",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts// parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Workspace Id",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')),'2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "OMSWorkspacekey",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts// parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Workspace key",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts// parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "OMSRecoveryVault",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts// parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Recovery Vault Name",
+ "value": "\"parameters('omsRecoveryVaultName')\""
+ }
+ },
+ {
+ "name": "OMSResourceGroupName",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts// parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Recovery Vault Name",
+ "value": "[concat('\"',resourceGroup().name,'\"')]"
+ }
+ },
+ {
+ "name": "OMSWorkspaceName",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts// parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Recovery Vault Name",
+ "value": "\"parameters('omsWorkspaceName')\""
+ }
+ },
+ {
+ "name": "(runbooks).omsABUscript.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/OMSWorkspaceId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/OMSWorkspacekey"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).omsABUscript.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).omsABUscript.description",
+ "publishContentLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, 'scripts/Automated-IaaS-Backup.ps1')]",
+ "version": "(runbooks).omsABUscript.version"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT627 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT627
new file mode 100644
index 0000000..06c6028
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT627
@@ -0,0 +1,158 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/omsRecoveryServices.json"
+ ],
+ "timestamp": 1642962898303,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/omsRecoveryServices.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT627",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.recoveryservices/vaults",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT627",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the ASR Recovery Vault"
+ }
+ },
+ "omsRecoveryVaultRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the region for your Recovery Vault"
+ }
+ }
+ },
+ "variables": {
+ "recoveryStorageAccountName": "[toLower(concat('asr', uniqueString(resourceGroup().id)))]",
+ "recoveryStorageType": "Standard_LRS"
+ },
+ "resources": [
+ {
+ "apiVersion": "2016-06-01",
+ "location": "omsRecoveryVaultRegion",
+ "name": "",
+ "type": "Microsoft.RecoveryServices/vaults",
+ "comments": "ASR Recovery Vault for OMS",
+ "sku": {
+ "name": "RS0",
+ "tier": "Standard"
+ },
+ "properties": {},
+ "resources": [
+ {
+ "apiVersion": "2016-06-01",
+ "name": "HyperVPrimarySite",
+ "type": "replicationFabrics",
+ "id": "Microsoft.RecoveryServices/vaults/replicationFabrics/ parameters('omsRecoveryVaultName')/HyperVPrimarySite",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults/ parameters('omsRecoveryVaultName')"
+ ],
+ "properties": {
+ "friendlyName": "PrimarySite",
+ "fabricType": "HyperVSite"
+ }
+ },
+ {
+ "apiVersion": "2016-06-01",
+ "name": "DefaultVMwarePolicy",
+ "type": "replicationPolicies",
+ "id": "Microsoft.RecoveryServices/vaults/replicationPolicies/ parameters('omsRecoveryVaultName')/DefaultVMwarePolicy",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults/ parameters('omsRecoveryVaultName')"
+ ],
+ "properties": {
+ "subscriptionid": "[subscription().subscriptionId]",
+ "friendlyName": "DefaultVMwarePolicy",
+ "providerSpecificInput": {
+ "instanceType": "InMageAzureV2",
+ "crashConsistentFrequencyInMinutes": 5,
+ "recoveryPointThresholdInMinutes": 15,
+ "recoveryPointHistory": 1440,
+ "appConsistentFrequencyInMinutes": 60,
+ "multiVmSyncStatus": "Enable"
+ }
+ }
+ },
+ {
+ "apiVersion": "2016-06-01",
+ "name": "DefaultVMwarePolicy-failback",
+ "type": "replicationPolicies",
+ "id": "Microsoft.RecoveryServices/vaults/replicationPolicies/ parameters('omsRecoveryVaultName')/DefaultVMwarePolicy-failback",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults/ parameters('omsRecoveryVaultName')",
+ "Microsoft.RecoveryServices/vaults/ parameters('omsRecoveryVaultName')/replicationPolicies/DefaultVMwarePolicy"
+ ],
+ "properties": {
+ "subscriptionid": "[subscription().subscriptionId]",
+ "friendlyName": "DefaultVMwarePolicy-failback",
+ "providerSpecificInput": {
+ "instanceType": "InMage",
+ "recoveryPointThresholdInMinutes": 15,
+ "recoveryPointHistory": 1440,
+ "appConsistentFrequencyInMinutes": 60,
+ "multiVmSyncStatus": "Enable"
+ }
+ }
+ },
+ {
+ "apiVersion": "2016-06-01",
+ "name": "DefaultHyperVPolicy",
+ "type": "replicationPolicies",
+ "id": "Microsoft.RecoveryServices/vaults/replicationPolicies/ parameters('omsRecoveryVaultName')/DefaultHyperVPolicy",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults/ parameters('omsRecoveryVaultName')"
+ ],
+ "properties": {
+ "subscriptionId": "[subscription().subscriptionId]",
+ "friendlyName": "DefaultHyperVPolicy",
+ "providerSpecificInput": {
+ "instanceType": "HyperVReplicaAzure",
+ "recoveryPointHistoryDurationInHours": 2,
+ "applicationConsistentSnapshotFrequencyInHours": 0,
+ "replicationInterval": 900,
+ "onlineReplicationStartTime": "",
+ "activeStorageAccountId": "[reference(resourceId('Microsoft.Storage/storageAccounts/',variables('recoveryStorageAccountName')))]",
+ "encryption": "Disable"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[toLower(concat('asr', uniqueString(resourceGroup().id)))]",
+ "apiVersion": "2016-01-01",
+ "location": "omsRecoveryVaultRegion",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT628 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT628
new file mode 100644
index 0000000..8271ed5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT628
@@ -0,0 +1,455 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/omsWorkspace.json"
+ ],
+ "timestamp": 1642962898314,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/nestedtemplates/omsWorkspace.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT628",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT628",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Assign a name for the Log Analytic Workspace Name"
+ }
+ },
+ "omsWorkspaceRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the region for your Workspace"
+ }
+ }
+ },
+ "variables": {
+ "batch1": {
+ "solutions": [
+ {
+ "name": "Security(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "Security"
+ },
+ {
+ "name": "AgentHealthAssessment(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AgentHealthAssessment"
+ },
+ {
+ "name": "ChangeTracking(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "ChangeTracking"
+ },
+ {
+ "name": "Updates(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "Updates"
+ },
+ {
+ "name": "AzureActivity(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AzureActivity"
+ },
+ {
+ "name": "ServiceMap(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "ServiceMap"
+ },
+ {
+ "name": "AzureAutomation(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AzureAutomation"
+ },
+ {
+ "name": "AzureSQLAnalytics(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AzureSQLAnalytics"
+ },
+ {
+ "name": "AlertManagement(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AlertManagement"
+ },
+ {
+ "name": "AntiMalware(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AntiMalware"
+ },
+ {
+ "name": "AzureNSGAnalytics(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AzureNSGAnalytics"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-15-preview",
+ "location": "omsWorkspaceRegion",
+ "name": "omsWorkspaceName",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "comments": "Log Analytics workspace",
+ "properties": {
+ "sku": {
+ "name": "pernode"
+ },
+ "features": {
+ "legacy": 0,
+ "searchVersion": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "AzureActivityLog",
+ "type": "datasources",
+ "apiVersion": "2015-11-01-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "AzureActivityLog",
+ "properties": {
+ "linkedResourceId": "[concat(subscription().id, '/providers/Microsoft.Insights/eventTypes/management')]"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "omsWorkspaceRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT629 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT629
new file mode 100644
index 0000000..fd03050
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT629
@@ -0,0 +1,376 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azmgmt-demo/azuredeploy.json",
+ "/demos/azmgmt-demo/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898326,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azmgmt-demo/azuredeploy.json",
+ "/demos/azmgmt-demo/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT629",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT629",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "azMgmtPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Provide a prefix for the Azure mgmt. services that will be created"
+ },
+ "value": "GEN-UNIQUE20"
+ },
+ "instanceCount": {
+ "type": "int",
+ "defaultValue": 2,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Specify the number of VMs to create"
+ },
+ "value": 1
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "az1demo",
+ "metadata": {
+ "description": "Assing a prefix for the VMs you will create"
+ },
+ "value": "GEN-UNIQUE10"
+ },
+ "platform": {
+ "type": "string",
+ "defaultValue": "WinSrv",
+ "allowedValues": [
+ "WinSrv",
+ "Linux"
+ ],
+ "metadata": {
+ "description": "Select the OS type to deploy."
+ },
+ "value": "Linux"
+ },
+ "username": {
+ "type": "string",
+ "defaultValue": "azureadmin",
+ "metadata": {
+ "description": "Assign a username to the VMs. Default will be 'azureadmin'."
+ },
+ "value": "azureadmin"
+ },
+ "pwdOrSsh": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Specify pwd if platform is WinSrv, or ssh if Linux."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of an existing Resource Group where the VMs will be deployed."
+ },
+ "value": ""
+ }
+ },
+ "variables": {
+ "nestedTemplates": {
+ "omsRecoveryServices": "[uri(deployment().properties.templateLink.uri, 'nestedtemplates/omsRecoveryServices.json')]",
+ "omsAutomation": "[uri(deployment().properties.templateLink.uri, 'nestedtemplates/omsAutomation.json')]",
+ "omsWorkspace": "[uri(deployment().properties.templateLink.uri, 'nestedtemplates/omsWorkspace.json')]",
+ "managedVMs": "[uri(deployment().properties.templateLink.uri, 'nestedtemplates/managedVms.json')]",
+ "asrRunbooks": "[uri(deployment().properties.templateLink.uri, 'nestedtemplates/asrRunbooks.json')]",
+ "dscConfigs": "[uri(deployment().properties.templateLink.uri, 'nestedtemplates/dscConfigs.json')]",
+ "mgmtDashboards": "[uri(deployment().properties.templateLink.uri, 'nestedtemplates/mgmtDashboards.json')]"
+ },
+ "resourceNames": {
+ "omsWorkspace": "[concat(parameters('azMgmtPrefix'), uniquestring(resourceGroup().name, '-oms'))]",
+ "azureAutomation": "[concat(parameters('azMgmtPrefix'), uniquestring(resourceGroup().name, '-auto'))]",
+ "azureRecoveryServices": "[concat(parameters('azMgmtPrefix'), uniquestring(resourceGroup().name, '-recovery'))]"
+ },
+ "azMgmtLocationMap": {
+ "eastasia": "southeastasia",
+ "southeastasia": "southeastasia",
+ "centralus": "westcentralus",
+ "eastus": "eastus",
+ "eastus2": "eastus",
+ "westus": "westcentralus",
+ "northcentralus": "westcentralus",
+ "southcentralus": "westcentralus",
+ "northeurope": "westeurope",
+ "westeurope": "westeurope",
+ "japanwest": "southeastasia",
+ "japaneast": "southeastasia",
+ "brazilsouth": "eastus",
+ "australiaeast": "australiasoutheast",
+ "australiasoutheast": "australiasoutheast",
+ "southindia": "southeastasia",
+ "centralindia": "southeastasia",
+ "westindia": "southeastasia",
+ "canadacentral": "eastus",
+ "canadaeast": "eastus",
+ "uksouth": "westeurope",
+ "ukwest": "westeurope",
+ "westcentralus": "westcentralus",
+ "westus2": "westcentralus",
+ "koreacentral": "southeastasia",
+ "koreasouth": "southeastasia",
+ "eastus2euap": "eastus"
+ },
+ "azMgmtLocation": "(azMgmtLocationMap)[resourceGroup().location]",
+ "azAutoLocationMap": {
+ "eastasia": "southeastasia",
+ "southeastasia": "southeastasia",
+ "centralus": "westcentralus",
+ "eastus": "eastus2",
+ "eastus2": "eastus2",
+ "westus": "westcentralus",
+ "northcentralus": "westcentralus",
+ "southcentralus": "southcentralus",
+ "northeurope": "westeurope",
+ "westeurope": "westeurope",
+ "japanwest": "southeastasia",
+ "japaneast": "southeastasia",
+ "brazilsouth": "eastus2",
+ "australiaeast": "australiasoutheast",
+ "australiasoutheast": "australiasoutheast",
+ "southindia": "southeastasia",
+ "centralindia": "southeastasia",
+ "westindia": "southeastasia",
+ "canadacentral": "eastus2",
+ "canadaeast": "eastus2",
+ "uksouth": "westeurope",
+ "ukwest": "westeurope",
+ "westcentralus": "westcentralus",
+ "westus2": "westcentralus",
+ "koreacentral": "southeastasia",
+ "koreasouth": "southeastasia",
+ "eastus2euap": "eastus2"
+ },
+ "azAutoLocation": "(azAutoLocationMap)[resourceGroup().location]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "name": "omsWorkspace",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsWorkspace",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "(resourceNames).omsWorkspace"
+ },
+ "omsWorkspaceRegion": {
+ "value": "(azMgmtLocationMap)[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "name": "omsRecoveryServices",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsRecoveryServices",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsRecoveryVaultName": {
+ "value": "(resourceNames).azureRecoveryServices"
+ },
+ "omsRecoveryVaultRegion": {
+ "value": "(azMgmtLocationMap)[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "name": "omsAutomation",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/omsRecoveryServices",
+ "Microsoft.Resources/deployments/omsWorkspace"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsAutomation",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsAutomationAccountName": {
+ "value": "(resourceNames).azureAutomation"
+ },
+ "omsAutomationRegion": {
+ "value": "(azAutoLocationMap)[resourceGroup().location]"
+ },
+ "omsRecoveryVaultName": {
+ "value": "(resourceNames).azureRecoveryServices"
+ },
+ "omsWorkspaceName": {
+ "value": "(resourceNames).omsWorkspace"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "name": "asrRunbooks",
+ "dependsOn": [
+ "omsAutomation"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).asrRunbooks",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "automationAccountName": {
+ "value": "(resourceNames).azureAutomation"
+ },
+ "automationRegion": {
+ "value": "(azAutoLocationMap)[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "name": "dscConfigs",
+ "dependsOn": [
+ "omsAutomation"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).dscConfigs",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsAutomationAccountName": {
+ "value": "(resourceNames).azureAutomation"
+ },
+ "omsAutomationRegion": {
+ "value": "(azAutoLocationMap)[resourceGroup().location]"
+ },
+ "omsWorkspaceName": {
+ "value": "(resourceNames).omsWorkspace"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "name": "deployVMs",
+ "resourceGroup": "",
+ "dependsOn": [
+ "omsWorkspace",
+ "omsRecoveryServices",
+ "dscConfigs"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).managedVMs",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "instanceCount": {
+ "value": 1
+ },
+ "vmNamePrefix": {
+ "value": "GEN-UNIQUE10"
+ },
+ "platform": {
+ "value": "Linux"
+ },
+ "userName": {
+ "value": "userName"
+ },
+ "pwdOrSsh": {
+ "value": "GEN-PASSWORD"
+ },
+ "omsRecoveryVaultName": {
+ "value": "(resourceNames).azureRecoveryServices"
+ },
+ "omsRecoveryVaultRegion": {
+ "value": "(azMgmtLocationMap)[resourceGroup().location]"
+ },
+ "omsResourceGroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "omsWorkspaceName": {
+ "value": "(resourceNames).omsWorkspace"
+ },
+ "automationAccountName": {
+ "value": "(resourceNames).azureAutomation"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "name": "mgmtDashboards",
+ "dependsOn": [
+ "omsAutomation",
+ "omsWorkspace",
+ "omsRecoveryServices"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).mgmtDashboards",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "(resourceNames).omsWorkspace"
+ },
+ "omsRecoveryVaultName": {
+ "value": "(resourceNames).azureRecoveryServices"
+ },
+ "omsAutomationAccountName": {
+ "value": "(resourceNames).azureAutomation"
+ },
+ "vmResourceGroup": {
+ "value": ""
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT63 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT63
new file mode 100644
index 0000000..d6a59fb
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT63
@@ -0,0 +1,75 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/empty-resources.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884499,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/empty-resources.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT63",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": []
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT63",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "value": "westus"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {},
+ "resources": [],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT630 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT630
new file mode 100644
index 0000000..f840790
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT630
@@ -0,0 +1,122 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-governance-operations-automation/nested/AutomationRunbooksOMSDashboard/deployRunbookOnSchedule.json"
+ ],
+ "timestamp": 1642962898338,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-governance-operations-automation/nested/AutomationRunbooksOMSDashboard/deployRunbookOnSchedule.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT630",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts/schedules",
+ "microsoft.automation/automationaccounts/jobschedules"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT630",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "accountName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Automation account to use. If this account exists, check the SKU and tags to make sure they match the exisitng account."
+ }
+ },
+ "scheduleName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the schedule."
+ }
+ },
+ "runbookName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the runbook to associate the schedule with."
+ }
+ },
+ "startTime": {
+ "type": "string",
+ "defaultValue": "12/30/2015 12:00:00",
+ "metadata": {
+ "description": "The time to start the schedule on. This is a datetime in Automation."
+ }
+ },
+ "frequency": {
+ "type": "string",
+ "allowedValues": [
+ "onetime",
+ "hour",
+ "day",
+ "week",
+ "month"
+ ],
+ "metadata": {
+ "description": "The frequency of the schedule."
+ }
+ },
+ "interval": {
+ "type": "int",
+ "metadata": {
+ "description": "The interval for the schedule to repeat on. "
+ }
+ },
+ "jobScheduleGuid": {
+ "type": "string",
+ "metadata": {
+ "description": "The GUID for the job schedule. This identifier links the schedule to the runbook."
+ }
+ },
+ "quickstartTags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "name": "accountName/scheduleName",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2021-04-01",
+ "properties": {
+ "description": "My schedule description",
+ "startTime": "12/30/2015 12:00:00",
+ "isEnabled": true,
+ "interval": "interval",
+ "frequency": "frequency"
+ }
+ },
+ {
+ "name": "accountName/jobScheduleGuid",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/schedules/accountName/scheduleName"
+ ],
+ "tags": {
+ "quickstartName": "quickstartTags"
+ },
+ "properties": {
+ "schedule": {
+ "name": "scheduleName"
+ },
+ "runbook": {
+ "name": "[ parameters('runbookName')]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT631 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT631
new file mode 100644
index 0000000..f812b33
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT631
@@ -0,0 +1,347 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-governance-operations-automation/nested/AutomationRunbooksOMSDashboard/OMSAutomationRunbooksDashboard.json"
+ ],
+ "timestamp": 1642962898360,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-governance-operations-automation/nested/AutomationRunbooksOMSDashboard/OMSAutomationRunbooksDashboard.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT631",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT631",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsId": {
+ "type": "string",
+ "metadata": {
+ "description": "Provide the OMS Workspace ID."
+ }
+ },
+ "omsKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Provide the OMS Workspace KEY."
+ }
+ },
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Provide the name of an existing Automation Account with SPN."
+ }
+ },
+ "automationRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the existing Automation Account."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring"
+ },
+ "quickstartTags": {
+ "type": "object"
+ }
+ },
+ "variables": {
+ "i-webrunbookDescription": "Authenticates to Azure and ingests all the WebApps metrics into an OMS wokrspace specified",
+ "i-sqlrunbookDescription": "Authenticates to Azure and ingests all the SQL Database metrics into an OMS wokrspace specified",
+ "s-runbookDescription": "Creates the schedules for the ingestion runbook to run every ten minutes on the hour",
+ "webIngestionRunbookName": "webAzureIngestion",
+ "sqlIngestionRunbookName": "sqlAzureIngestion",
+ "scheduleRunbookName": "scheduleIngestion",
+ "webIngestionScriptUri": "[uri(parameters('_artifactsLocation'), concat('nested/AutomationRunbooksOMSDashboard/scripts/webappazureIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "sqlIngestionScriptUri": "[uri(parameters('_artifactsLocation'), concat('nested/AutomationRunbooksOMSDashboard/scripts/sqlazureIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "scheduleScriptUri": "[uri(parameters('_artifactsLocation'), concat('nested/AutomationRunbooksOMSDashboard/scripts/scheduleIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "sku": "Basic",
+ "psModules": {
+ "AzureRmProfile": {
+ "Name": "AzureRm.Profile",
+ "URL": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.profile.1.0.9.nupkg"
+ },
+ "AzureRmInsights": {
+ "Name": "AzureRm.Insights",
+ "URL": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.insights.1.0.9.nupkg"
+ },
+ "AzureRmSql": {
+ "Name": "AzureRm.SQL",
+ "URL": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.sql.1.0.9.nupkg"
+ },
+ "AzureRmResources": {
+ "Name": "AzureRm.Resources",
+ "URL": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.resources.2.0.0.nupkg"
+ },
+ "AzureRmAutomation": {
+ "Name": "AzureRm.Automation",
+ "URL": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.automation.1.0.9.nupkg"
+ },
+ "OMSIngestionAPI": {
+ "Name": "OMSIngestionAPI",
+ "URL": "https://devopsgallerystorage.blob.core.windows.net/packages/omsingestionapi.1.3.0.nupkg"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "automationAccountName",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2021-04-01",
+ "location": "automationRegion",
+ "tags": {
+ "quickstartName": "quickstartTags"
+ },
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "webAzureIngestion",
+ "type": "runbooks",
+ "location": "automationRegion",
+ "apiVersion": "2020-01-13-preview",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "runbookType": "PowerShell",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "Authenticates to Azure and ingests all the WebApps metrics into an OMS wokrspace specified",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/AutomationRunbooksOMSDashboard/scripts/webappazureIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "name": "sqlAzureIngestion",
+ "type": "runbooks",
+ "location": "automationRegion",
+ "apiVersion": "2020-01-13-preview",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "runbookType": "PowerShell",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "Authenticates to Azure and ingests all the SQL Database metrics into an OMS wokrspace specified",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/AutomationRunbooksOMSDashboard/scripts/sqlazureIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "name": "OPSINSIGHTS_WS_ID",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "Encrypted value of the users OMS Workspace ID",
+ "isEncrypted": true,
+ "type": "string",
+ "value": "\"omsId\""
+ }
+ },
+ {
+ "name": "OPSINSIGHTS_WS_KEY",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "Encrypted value of the users OMS Workspace KEY",
+ "isEncrypted": true,
+ "value": "\"omsKey\""
+ }
+ },
+ {
+ "name": "SubscriptionID",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "The subscription ID for the resource",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "metricresourceGroupName",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "The name of the resource group where your Azure Resource is hosted.",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',resourceGroup().name,'\"')]"
+ }
+ },
+ {
+ "name": "AzureAutomationAccount",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"automationAccountName\""
+ }
+ },
+ {
+ "name": "AzureAutomationResourceGroup",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',resourceGroup().name,'\"')]"
+ }
+ },
+ {
+ "name": "(psModules).AzureRmProfile.Name",
+ "type": "modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRmProfile.URL"
+ }
+ }
+ },
+ {
+ "name": "(psModules).AzureRmResources.Name",
+ "type": "modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules/automationAccountName/(psModules).AzureRmProfile.Name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRMResources.URL"
+ }
+ }
+ },
+ {
+ "name": "(psModules).AzureRmInsights.Name",
+ "type": "modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules/automationAccountName/(psModules).AzureRmProfile.Name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRMInsights.URL"
+ }
+ }
+ },
+ {
+ "name": "(psModules).AzureRmSql.Name",
+ "type": "modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules/automationAccountName/(psModules).AzureRmProfile.Name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRmSql.URL"
+ }
+ }
+ },
+ {
+ "name": "(psModules).AzureRmAutomation.Name",
+ "type": "modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules/automationAccountName/(psModules).AzureRmProfile.Name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).AzureRMAutomation.URL"
+ }
+ }
+ },
+ {
+ "name": "(psModules).OMSIngestionAPI.Name",
+ "type": "modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName",
+ "Microsoft.Automation/automationAccounts/modules/automationAccountName/(psModules).AzureRmProfile.Name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).OMSIngestionAPI.URL"
+ }
+ }
+ },
+ {
+ "name": "scheduleIngestion",
+ "type": "runbooks",
+ "location": "automationRegion",
+ "apiVersion": "2020-01-13-preview",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//automationAccountName"
+ ],
+ "properties": {
+ "runbookType": "PowerShell",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "Creates the schedules for the ingestion runbook to run every ten minutes on the hour",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/AutomationRunbooksOMSDashboard/scripts/scheduleIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT632 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT632
new file mode 100644
index 0000000..41c7b38
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT632
@@ -0,0 +1,80 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-governance-operations-automation/nested/OMSCommon/OMSCommon.json"
+ ],
+ "timestamp": 1642962898386,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-governance-operations-automation/nested/OMSCommon/OMSCommon.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT632",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT632",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "workspaceName"
+ }
+ },
+ "serviceTier": {
+ "type": "string",
+ "allowedValues": [
+ "Free",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Service Tier: Free, Standard, or Premium"
+ }
+ },
+ "omsRegion": {
+ "type": "string"
+ },
+ "quickstartTags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-10-01",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "name": "workspaceName",
+ "location": "omsRegion",
+ "tags": {
+ "quickstartName": "quickstartTags"
+ },
+ "properties": {
+ "sku": {
+ "Name": "serviceTier"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "workspaceIdOutput": {
+ "value": "[reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName')), '2020-10-01').customerId]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT633 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT633
new file mode 100644
index 0000000..9a63277
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT633
@@ -0,0 +1,618 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-governance-operations-automation/azuredeploy.json",
+ "/demos/azure-governance-operations-automation/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898395,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-governance-operations-automation/azuredeploy.json",
+ "/demos/azure-governance-operations-automation/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT633",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.web/sites",
+ "microsoft.sql/servers",
+ "microsoft.insights/autoscalesettings",
+ "microsoft.insights/metricalerts",
+ "microsoft.insights/actiongroups",
+ "microsoft.insights/components",
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT633",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceSharedKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Shared key of the OMS workspace"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "F1",
+ "allowedValues": [
+ "F1",
+ "D1",
+ "B1",
+ "B2",
+ "B3",
+ "S1",
+ "S2",
+ "S3",
+ "P1",
+ "P2",
+ "P3",
+ "P4"
+ ],
+ "metadata": {
+ "description": "Describes plan's pricing tier and instance size. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/"
+ }
+ },
+ "skuCapacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "minValue": 1,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Describes plan's instance count"
+ }
+ },
+ "sqlAdministratorLogin": {
+ "type": "string",
+ "defaultValue": "cloudwiseuser",
+ "metadata": {
+ "description": "The account name to use for the database server administrator."
+ },
+ "value": "cloudwiseuser"
+ },
+ "sqlAdministratorLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password to use for the database server administrator."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "CloudWiseOMSWorkspace",
+ "metadata": {
+ "description": "Provide the OMS Workspace Name."
+ },
+ "value": "CloudWiseOMSWorkspace"
+ },
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Provide the name of an existing Automation Account with SPN."
+ },
+ "value": "cloudwise-automation"
+ },
+ "automationRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the existing Automation Account."
+ },
+ "value": "East US 2"
+ },
+ "omsRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the OMS regions."
+ },
+ "value": "East US"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "actionGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the action group."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "actionGroupShortName": {
+ "type": "string",
+ "metadata": {
+ "description": "The short name of the action group."
+ },
+ "value": "acg"
+ },
+ "emails": {
+ "type": "array",
+ "metadata": {
+ "description": "A list of strings representing the email addresses to send alerts to."
+ },
+ "value": [
+ "youremail@yourdomain.com"
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "hostingPlanName": "[concat('CloudWiseHostingplan-', uniqueString(resourceGroup().id))]",
+ "webSiteName": "[concat('CloudWise', uniqueString(resourceGroup().id))]",
+ "sqlserverName": "[concat('sqlcloudwise', uniqueString(resourceGroup().id))]",
+ "sqlDatabaseName": "cloudwisedb",
+ "sqlCollation": "SQL_Latin1_General_CP1_CI_AS",
+ "sqlMaxSizeBytes": "1073741824",
+ "sqlEdition": "Basic",
+ "sqlRequestedServiceObjectiveName": "Basic",
+ "insightsName": "[concat(variables('webSiteName'),'insights')]",
+ "omsWorkspaceName": "[concat(parameters('omsWorkspaceName'), uniqueString(resourceGroup().id, deployment().name))]",
+ "OMSWebAppsRunBookAndDashboardTemplateFolder": "nested/AutomationRunbooksOMSDashboard",
+ "OMSWebAppsRunBookAndDashboardTemplateFileName": "OMSAutomationRunbooksDashboard.json",
+ "OMSCommonTemplateFolder": "nested/OMSCommon",
+ "OMSCommonTemplateFileName": "OMSCommon.json",
+ "quickstartTags": {
+ "type": "object",
+ "name": "azure-governance-operations-automation"
+ }
+ },
+ "resources": [
+ {
+ "name": "[variables('sqlserverName')]",
+ "type": "Microsoft.Sql/servers",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "SqlServer",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "apiVersion": "2021-02-01-preview",
+ "properties": {
+ "administratorLogin": "cloudwiseuser",
+ "administratorLoginPassword": "GEN-PASSWORD"
+ },
+ "resources": [
+ {
+ "name": "cloudwisedb",
+ "type": "databases",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-02-01-preview",
+ "dependsOn": [
+ "Microsoft.Sql/servers//sqlServerName"
+ ],
+ "properties": {
+ "edition": "Basic",
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "maxSizeBytes": "1073741824",
+ "requestedServiceObjectiveName": "Basic"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "name": "[variables('hostingPlanName')]",
+ "type": "Microsoft.Web/serverfarms",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "HostingPlan",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "sku": {
+ "name": "F1",
+ "capacity": 1
+ },
+ "properties": {
+ "name": "[variables('hostingPlanName')]"
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "name": "[variables('webSiteName')]",
+ "type": "Microsoft.Web/sites",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[variables('hostingPlanName')]"
+ ],
+ "tags": {
+ "[concat('hidden-related:', resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName')))]": "empty",
+ "displayName": "Website",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "name": "[variables('webSiteName')]",
+ "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "name": "web",
+ "type": "config",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]",
+ "[resourceId('Microsoft.Web/Sites/extensions', variables('webSiteName'), 'MSDeploy')]"
+ ],
+ "tags": {
+ "displayName": "WebAppConfig",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "netFrameworkVersion": "v4.6"
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "config",
+ "name": "connectionstrings",
+ "dependsOn": [
+ "[variables('webSiteName')]",
+ "[resourceId('Microsoft.Web/Sites/extensions', variables('webSiteName'), 'MSDeploy')]"
+ ],
+ "properties": {
+ "DefaultConnection": {
+ "value": "[concat('Data Source=tcp:', reference(resourceId('Microsoft.Sql/servers/', variables('sqlserverName'))).fullyQualifiedDomainName, ',1433;Initial Catalog=', variables('sqlDatabaseName'), ';User Id=', parameters('sqlAdministratorLogin'), '@', variables('sqlserverName'), ';Password=', parameters('sqlAdministratorLoginPassword'), ';', 'MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]",
+ "type": "SQLServer"
+ },
+ "SQLCONNSTR_DefaultConnection": {
+ "value": "[concat('Data Source=tcp:', reference(resourceId('Microsoft.Sql/servers/', variables('sqlserverName'))).fullyQualifiedDomainName, ',1433;Initial Catalog=', variables('sqlDatabaseName'), ';User Id=', parameters('sqlAdministratorLogin'), '@', variables('sqlserverName'), ';Password=', parameters('sqlAdministratorLoginPassword'), ';', 'MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]",
+ "type": "SQLServer"
+ }
+ }
+ },
+ {
+ "name": "MSDeploy",
+ "type": "extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Web/sites//Websitename"
+ ],
+ "tags": {
+ "displayName": "WebAppMSDeploy",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "packageUri": "[uri(parameters('_artifactsLocation'), concat('artifacts/package.zip', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ ]
+ },
+ {
+ "name": "[concat(variables('hostingPlanName'), '-', resourceGroup().name)]",
+ "type": "Microsoft.Insights/autoscalesettings",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-04-01",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "tags": {
+ "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', variables('hostingPlanName'))]": "Resource",
+ "displayName": "[concat(variables('insightsName'), ' AutoScale')]",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "name": "[concat(variables('hostingPlanName'), '-', resourceGroup().name)]",
+ "profiles": [
+ {
+ "name": "Default",
+ "capacity": {
+ "minimum": "1",
+ "maximum": "2",
+ "default": "1"
+ },
+ "rules": [
+ {
+ "metricTrigger": {
+ "metricName": "CpuPercentage",
+ "metricResourceUri": "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT10M",
+ "timeAggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 80
+ },
+ "scaleAction": {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT10M"
+ }
+ },
+ {
+ "metricTrigger": {
+ "metricName": "CpuPercentage",
+ "metricResourceUri": "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT1H",
+ "timeAggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 60
+ },
+ "scaleAction": {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT1H"
+ }
+ }
+ ]
+ }
+ ],
+ "enabled": false,
+ "targetResourceUri": "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE",
+ "type": "microsoft.insights/actionGroups",
+ "apiVersion": "2019-06-01",
+ "location": "global",
+ "properties": {
+ "groupShortName": "acg",
+ "enabled": true,
+ "emailReceivers": [
+ {
+ "name": "test",
+ "emailAddress": null,
+ "useCommonAlertSchema": true
+ }
+ ]
+ }
+ },
+ {
+ "name": "[concat('The average CPU is high across all the instances of ', variables('hostingPlanName'))]",
+ "type": "Microsoft.Insights/metricAlerts",
+ "apiVersion": "2018-03-01",
+ "location": "global",
+ "tags": {
+ "[concat('hidden-link:', '/subscriptions/', subscription().subscriptionId,'/resourcegroups/', resourceGroup().name, '/providers/Microsoft.Web/serverfarms/', variables('hostingPlanName'))]": "Resource"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "properties": {
+ "severity": 1,
+ "enabled": true,
+ "scopes": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "targetResourceType": "Microsoft.Web/serverfarms",
+ "targetResourceRegion": "[resourceGroup().location]",
+ "evaluationFrequency": "PT1M",
+ "windowSize": "PT15M",
+ "criteria": {
+ "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
+ "allOf": [
+ {
+ "name": "[concat('Microsoft.Web/serverfarms/', variables('hostingPlanName'), '-cpupercentage')]",
+ "metricName": "CpuPercentage",
+ "operator": "GreaterThan",
+ "threshold": 90,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ }
+ ],
+ "componentId": "[resourceId('Microsoft.Insights/components',variables('insightsName'))]",
+ "metricName": "[concat('The average CPU is high across all the instances of ', variables('hostingPlanName'))]"
+ },
+ "actions": [
+ {
+ "actionGroupId": "microsoft.insights/actionGroups/GEN-UNIQUE"
+ }
+ ]
+ }
+ },
+ {
+ "name": "[concat('LongHttpQueue ', variables('hostingPlanName'))]",
+ "type": "Microsoft.Insights/metricAlerts",
+ "apiVersion": "2018-03-01",
+ "location": "global",
+ "tags": {
+ "[concat('hidden-link:', '/subscriptions/', subscription().subscriptionId,'/resourcegroups/', resourceGroup().name, '/providers/Microsoft.Web/serverfarms/', variables('hostingPlanName'))]": "Resource"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "properties": {
+ "severity": 1,
+ "enabled": true,
+ "scopes": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "targetResourceType": "Microsoft.Web/serverfarms",
+ "targetResourceRegion": "[resourceGroup().location]",
+ "evaluationFrequency": "PT1M",
+ "windowSize": "PT5M",
+ "criteria": {
+ "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
+ "allOf": [
+ {
+ "name": "[concat('Microsoft.Web/serverfarms/', variables('hostingPlanName'), '-httpqueuelegth')]",
+ "metricName": "HttpQueueLength",
+ "operator": "GreaterThan",
+ "threshold": 100,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ }
+ ],
+ "componentId": "[resourceId('Microsoft.Insights/components',variables('insightsName'))]",
+ "metricName": "[concat('The HTTP queue for the instances of ', variables('hostingPlanName'), ' has a large number of pending requests.')]"
+ },
+ "actions": [
+ {
+ "actionGroupId": "microsoft.insights/actionGroups/GEN-UNIQUE"
+ }
+ ]
+ }
+ },
+ {
+ "name": "[concat('ServerErrors ', variables('webSiteName'))]",
+ "type": "Microsoft.Insights/metricAlerts",
+ "apiVersion": "2018-03-01",
+ "location": "global",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]"
+ ],
+ "tags": {
+ "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('webSiteName'))]": "Resource"
+ },
+ "properties": {
+ "severity": 1,
+ "enabled": true,
+ "scopes": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]"
+ ],
+ "targetResourceType": "Microsoft.Web/sites",
+ "targetResourceRegion": "[resourceGroup().location]",
+ "evaluationFrequency": "PT1M",
+ "windowSize": "PT5M",
+ "criteria": {
+ "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
+ "allOf": [
+ {
+ "name": "[concat('Microsoft.Web/sites', variables('webSiteName'), '-5XX-errors')]",
+ "metricName": "Http5xx",
+ "operator": "GreaterThan",
+ "threshold": 0,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ },
+ {
+ "name": "[concat('Microsoft.Web/sites', variables('webSiteName'), '-403-errors')]",
+ "metricName": "Http403",
+ "operator": "GreaterThan",
+ "threshold": 0,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ }
+ ],
+ "componentId": "[resourceId('Microsoft.Insights/components',variables('insightsName'))]",
+ "metricName": "[concat(variables('webSiteName'), 'server errors')]"
+ },
+ "actions": [
+ {
+ "actionGroupId": "microsoft.insights/actionGroups/GEN-UNIQUE"
+ }
+ ]
+ }
+ },
+ {
+ "name": "[variables('insightsName')]",
+ "type": "Microsoft.Insights/components",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-02-02",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]"
+ ],
+ "tags": {
+ "displayName": "[concat('Component', variables('insightsName'))]",
+ "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('webSiteName'))]": "Resource",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "Application_Type": "web"
+ }
+ },
+ {
+ "name": "omsWorkspace",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(variables('OMSCommonTemplateFolder'), '/', variables('OMSCommonTemplateFileName'), parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "[variables('omsWorkspaceName')]"
+ },
+ "omsRegion": {
+ "value": "East US"
+ },
+ "serviceTier": {
+ "value": "Free"
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "azure-governance-operations-automation"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "OMSAutomationRunBooksAndDashboard",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/omsWorkspace"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(variables('OMSWebAppsRunBookAndDashboardTemplateFolder'), '/', variables('OMSWebAppsRunBookAndDashboardTemplateFileName'), parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsId": {
+ "value": "[reference('omsWorkspace').outputs.workspaceIdOutput.value]"
+ },
+ "omsKey": {
+ "value": "GEN-PASSWORD"
+ },
+ "automationAccountName": {
+ "value": "cloudwise-automation"
+ },
+ "automationRegion": {
+ "value": "East US 2"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "azure-governance-operations-automation"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT634 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT634
new file mode 100644
index 0000000..914efac
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT634
@@ -0,0 +1,619 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-governance-operations-automation/azuredeploy.json",
+ "/demos/azure-governance-operations-automation/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962898405,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-governance-operations-automation/azuredeploy.json",
+ "/demos/azure-governance-operations-automation/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT634",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.web/sites",
+ "microsoft.sql/servers",
+ "microsoft.insights/autoscalesettings",
+ "microsoft.insights/metricalerts",
+ "microsoft.insights/actiongroups",
+ "microsoft.insights/components",
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT634",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceSharedKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Shared key of the OMS workspace"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "F1",
+ "allowedValues": [
+ "F1",
+ "D1",
+ "B1",
+ "B2",
+ "B3",
+ "S1",
+ "S2",
+ "S3",
+ "P1",
+ "P2",
+ "P3",
+ "P4"
+ ],
+ "metadata": {
+ "description": "Describes plan's pricing tier and instance size. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/"
+ }
+ },
+ "skuCapacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "minValue": 1,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Describes plan's instance count"
+ }
+ },
+ "sqlAdministratorLogin": {
+ "type": "string",
+ "defaultValue": "cloudwiseuser",
+ "metadata": {
+ "description": "The account name to use for the database server administrator."
+ },
+ "value": "cloudwiseuser"
+ },
+ "sqlAdministratorLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password to use for the database server administrator."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "CloudWiseOMSWorkspace",
+ "metadata": {
+ "description": "Provide the OMS Workspace Name."
+ },
+ "value": "CloudWiseOMSWorkspace"
+ },
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Provide the name of an existing Automation Account with SPN."
+ },
+ "value": "cloudwise-automation"
+ },
+ "automationRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the existing Automation Account."
+ },
+ "value": "US Gov Virginia"
+ },
+ "omsRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the OMS regions."
+ },
+ "value": "US Gov Virginia"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "actionGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the action group."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "actionGroupShortName": {
+ "type": "string",
+ "metadata": {
+ "description": "The short name of the action group."
+ },
+ "value": "acg"
+ },
+ "emails": {
+ "type": "array",
+ "metadata": {
+ "description": "A list of strings representing the email addresses to send alerts to."
+ },
+ "value": [
+ "youremail@yourdomain.com"
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ },
+ "value": "US Gov Virginia"
+ }
+ },
+ "variables": {
+ "hostingPlanName": "[concat('CloudWiseHostingplan-', uniqueString(resourceGroup().id))]",
+ "webSiteName": "[concat('CloudWise', uniqueString(resourceGroup().id))]",
+ "sqlserverName": "[concat('sqlcloudwise', uniqueString(resourceGroup().id))]",
+ "sqlDatabaseName": "cloudwisedb",
+ "sqlCollation": "SQL_Latin1_General_CP1_CI_AS",
+ "sqlMaxSizeBytes": "1073741824",
+ "sqlEdition": "Basic",
+ "sqlRequestedServiceObjectiveName": "Basic",
+ "insightsName": "[concat(variables('webSiteName'),'insights')]",
+ "omsWorkspaceName": "[concat(parameters('omsWorkspaceName'), uniqueString(resourceGroup().id, deployment().name))]",
+ "OMSWebAppsRunBookAndDashboardTemplateFolder": "nested/AutomationRunbooksOMSDashboard",
+ "OMSWebAppsRunBookAndDashboardTemplateFileName": "OMSAutomationRunbooksDashboard.json",
+ "OMSCommonTemplateFolder": "nested/OMSCommon",
+ "OMSCommonTemplateFileName": "OMSCommon.json",
+ "quickstartTags": {
+ "type": "object",
+ "name": "azure-governance-operations-automation"
+ }
+ },
+ "resources": [
+ {
+ "name": "[variables('sqlserverName')]",
+ "type": "Microsoft.Sql/servers",
+ "location": "US Gov Virginia",
+ "tags": {
+ "displayName": "SqlServer",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "apiVersion": "2021-02-01-preview",
+ "properties": {
+ "administratorLogin": "cloudwiseuser",
+ "administratorLoginPassword": "GEN-PASSWORD"
+ },
+ "resources": [
+ {
+ "name": "cloudwisedb",
+ "type": "databases",
+ "location": "US Gov Virginia",
+ "apiVersion": "2021-02-01-preview",
+ "dependsOn": [
+ "Microsoft.Sql/servers//sqlServerName"
+ ],
+ "properties": {
+ "edition": "Basic",
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "maxSizeBytes": "1073741824",
+ "requestedServiceObjectiveName": "Basic"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "name": "[variables('hostingPlanName')]",
+ "type": "Microsoft.Web/serverfarms",
+ "location": "US Gov Virginia",
+ "tags": {
+ "displayName": "HostingPlan",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "sku": {
+ "name": "F1",
+ "capacity": 1
+ },
+ "properties": {
+ "name": "[variables('hostingPlanName')]"
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "name": "[variables('webSiteName')]",
+ "type": "Microsoft.Web/sites",
+ "location": "US Gov Virginia",
+ "dependsOn": [
+ "[variables('hostingPlanName')]"
+ ],
+ "tags": {
+ "[concat('hidden-related:', resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName')))]": "empty",
+ "displayName": "Website",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "name": "[variables('webSiteName')]",
+ "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "name": "web",
+ "type": "config",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]",
+ "[resourceId('Microsoft.Web/Sites/extensions', variables('webSiteName'), 'MSDeploy')]"
+ ],
+ "tags": {
+ "displayName": "WebAppConfig",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "netFrameworkVersion": "v4.6"
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "config",
+ "name": "connectionstrings",
+ "dependsOn": [
+ "[variables('webSiteName')]",
+ "[resourceId('Microsoft.Web/Sites/extensions', variables('webSiteName'), 'MSDeploy')]"
+ ],
+ "properties": {
+ "DefaultConnection": {
+ "value": "[concat('Data Source=tcp:', reference(resourceId('Microsoft.Sql/servers/', variables('sqlserverName'))).fullyQualifiedDomainName, ',1433;Initial Catalog=', variables('sqlDatabaseName'), ';User Id=', parameters('sqlAdministratorLogin'), '@', variables('sqlserverName'), ';Password=', parameters('sqlAdministratorLoginPassword'), ';', 'MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]",
+ "type": "SQLServer"
+ },
+ "SQLCONNSTR_DefaultConnection": {
+ "value": "[concat('Data Source=tcp:', reference(resourceId('Microsoft.Sql/servers/', variables('sqlserverName'))).fullyQualifiedDomainName, ',1433;Initial Catalog=', variables('sqlDatabaseName'), ';User Id=', parameters('sqlAdministratorLogin'), '@', variables('sqlserverName'), ';Password=', parameters('sqlAdministratorLoginPassword'), ';', 'MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]",
+ "type": "SQLServer"
+ }
+ }
+ },
+ {
+ "name": "MSDeploy",
+ "type": "extensions",
+ "location": "US Gov Virginia",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Web/sites//Websitename"
+ ],
+ "tags": {
+ "displayName": "WebAppMSDeploy",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "packageUri": "[uri(parameters('_artifactsLocation'), concat('artifacts/package.zip', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ ]
+ },
+ {
+ "name": "[concat(variables('hostingPlanName'), '-', resourceGroup().name)]",
+ "type": "Microsoft.Insights/autoscalesettings",
+ "location": "US Gov Virginia",
+ "apiVersion": "2015-04-01",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "tags": {
+ "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', variables('hostingPlanName'))]": "Resource",
+ "displayName": "[concat(variables('insightsName'), ' AutoScale')]",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "name": "[concat(variables('hostingPlanName'), '-', resourceGroup().name)]",
+ "profiles": [
+ {
+ "name": "Default",
+ "capacity": {
+ "minimum": "1",
+ "maximum": "2",
+ "default": "1"
+ },
+ "rules": [
+ {
+ "metricTrigger": {
+ "metricName": "CpuPercentage",
+ "metricResourceUri": "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT10M",
+ "timeAggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 80
+ },
+ "scaleAction": {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT10M"
+ }
+ },
+ {
+ "metricTrigger": {
+ "metricName": "CpuPercentage",
+ "metricResourceUri": "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT1H",
+ "timeAggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 60
+ },
+ "scaleAction": {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT1H"
+ }
+ }
+ ]
+ }
+ ],
+ "enabled": false,
+ "targetResourceUri": "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE",
+ "type": "microsoft.insights/actionGroups",
+ "apiVersion": "2019-06-01",
+ "location": "global",
+ "properties": {
+ "groupShortName": "acg",
+ "enabled": true,
+ "emailReceivers": [
+ {
+ "name": "test",
+ "emailAddress": null,
+ "useCommonAlertSchema": true
+ }
+ ]
+ }
+ },
+ {
+ "name": "[concat('The average CPU is high across all the instances of ', variables('hostingPlanName'))]",
+ "type": "Microsoft.Insights/metricAlerts",
+ "apiVersion": "2018-03-01",
+ "location": "global",
+ "tags": {
+ "[concat('hidden-link:', '/subscriptions/', subscription().subscriptionId,'/resourcegroups/', resourceGroup().name, '/providers/Microsoft.Web/serverfarms/', variables('hostingPlanName'))]": "Resource"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "properties": {
+ "severity": 1,
+ "enabled": true,
+ "scopes": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "targetResourceType": "Microsoft.Web/serverfarms",
+ "targetResourceRegion": "US Gov Virginia",
+ "evaluationFrequency": "PT1M",
+ "windowSize": "PT15M",
+ "criteria": {
+ "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
+ "allOf": [
+ {
+ "name": "[concat('Microsoft.Web/serverfarms/', variables('hostingPlanName'), '-cpupercentage')]",
+ "metricName": "CpuPercentage",
+ "operator": "GreaterThan",
+ "threshold": 90,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ }
+ ],
+ "componentId": "[resourceId('Microsoft.Insights/components',variables('insightsName'))]",
+ "metricName": "[concat('The average CPU is high across all the instances of ', variables('hostingPlanName'))]"
+ },
+ "actions": [
+ {
+ "actionGroupId": "microsoft.insights/actionGroups/GEN-UNIQUE"
+ }
+ ]
+ }
+ },
+ {
+ "name": "[concat('LongHttpQueue ', variables('hostingPlanName'))]",
+ "type": "Microsoft.Insights/metricAlerts",
+ "apiVersion": "2018-03-01",
+ "location": "global",
+ "tags": {
+ "[concat('hidden-link:', '/subscriptions/', subscription().subscriptionId,'/resourcegroups/', resourceGroup().name, '/providers/Microsoft.Web/serverfarms/', variables('hostingPlanName'))]": "Resource"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "properties": {
+ "severity": 1,
+ "enabled": true,
+ "scopes": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]"
+ ],
+ "targetResourceType": "Microsoft.Web/serverfarms",
+ "targetResourceRegion": "US Gov Virginia",
+ "evaluationFrequency": "PT1M",
+ "windowSize": "PT5M",
+ "criteria": {
+ "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
+ "allOf": [
+ {
+ "name": "[concat('Microsoft.Web/serverfarms/', variables('hostingPlanName'), '-httpqueuelegth')]",
+ "metricName": "HttpQueueLength",
+ "operator": "GreaterThan",
+ "threshold": 100,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ }
+ ],
+ "componentId": "[resourceId('Microsoft.Insights/components',variables('insightsName'))]",
+ "metricName": "[concat('The HTTP queue for the instances of ', variables('hostingPlanName'), ' has a large number of pending requests.')]"
+ },
+ "actions": [
+ {
+ "actionGroupId": "microsoft.insights/actionGroups/GEN-UNIQUE"
+ }
+ ]
+ }
+ },
+ {
+ "name": "[concat('ServerErrors ', variables('webSiteName'))]",
+ "type": "Microsoft.Insights/metricAlerts",
+ "apiVersion": "2018-03-01",
+ "location": "global",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]"
+ ],
+ "tags": {
+ "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('webSiteName'))]": "Resource"
+ },
+ "properties": {
+ "severity": 1,
+ "enabled": true,
+ "scopes": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]"
+ ],
+ "targetResourceType": "Microsoft.Web/sites",
+ "targetResourceRegion": "US Gov Virginia",
+ "evaluationFrequency": "PT1M",
+ "windowSize": "PT5M",
+ "criteria": {
+ "odata.type": "Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria",
+ "allOf": [
+ {
+ "name": "[concat('Microsoft.Web/sites', variables('webSiteName'), '-5XX-errors')]",
+ "metricName": "Http5xx",
+ "operator": "GreaterThan",
+ "threshold": 0,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ },
+ {
+ "name": "[concat('Microsoft.Web/sites', variables('webSiteName'), '-403-errors')]",
+ "metricName": "Http403",
+ "operator": "GreaterThan",
+ "threshold": 0,
+ "timeAggregation": "Average",
+ "criterionType": "StaticThresholdCriterion"
+ }
+ ],
+ "componentId": "[resourceId('Microsoft.Insights/components',variables('insightsName'))]",
+ "metricName": "[concat(variables('webSiteName'), 'server errors')]"
+ },
+ "actions": [
+ {
+ "actionGroupId": "microsoft.insights/actionGroups/GEN-UNIQUE"
+ }
+ ]
+ }
+ },
+ {
+ "name": "[variables('insightsName')]",
+ "type": "Microsoft.Insights/components",
+ "location": "US Gov Virginia",
+ "apiVersion": "2020-02-02",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/sites/', variables('webSiteName'))]"
+ ],
+ "tags": {
+ "displayName": "[concat('Component', variables('insightsName'))]",
+ "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('webSiteName'))]": "Resource",
+ "quickstartName": "(quickstartTags).name"
+ },
+ "properties": {
+ "Application_Type": "web"
+ }
+ },
+ {
+ "name": "omsWorkspace",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(variables('OMSCommonTemplateFolder'), '/', variables('OMSCommonTemplateFileName'), parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "[variables('omsWorkspaceName')]"
+ },
+ "omsRegion": {
+ "value": "US Gov Virginia"
+ },
+ "serviceTier": {
+ "value": "Free"
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "azure-governance-operations-automation"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "OMSAutomationRunBooksAndDashboard",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/omsWorkspace"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(variables('OMSWebAppsRunBookAndDashboardTemplateFolder'), '/', variables('OMSWebAppsRunBookAndDashboardTemplateFileName'), parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsId": {
+ "value": "[reference('omsWorkspace').outputs.workspaceIdOutput.value]"
+ },
+ "omsKey": {
+ "value": "GEN-PASSWORD"
+ },
+ "automationAccountName": {
+ "value": "cloudwise-automation"
+ },
+ "automationRegion": {
+ "value": "US Gov Virginia"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "azure-governance-operations-automation"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT635 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT635
new file mode 100644
index 0000000..55670be
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT635
@@ -0,0 +1,908 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.json",
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898422,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.json",
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT635",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts/schedules",
+ "microsoft.automation/automationaccounts/jobschedules",
+ "microsoft.automation/automationaccounts/credentials",
+ "microsoft.automation/automationaccounts/runbooks",
+ "microsoft.automation/automationaccounts/modules",
+ "microsoft.automation/automationaccounts",
+ "microsoft.automation/automationaccounts/variables"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT635",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "newGuid": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "Enter new GUID, you can generate one from Powershell using new-guid or get one from this site: GUID Generator"
+ }
+ },
+ "automationAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('aa-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Assign a name for the Automation account of your choosing. Must be a unique name as Azure Automation accounts are FQDNs"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specify the region for your Automation account"
+ },
+ "value": "eastus2"
+ },
+ "azureAdmin": {
+ "type": "string",
+ "metadata": {
+ "description": "Enter your service admin user, ex: serviceaccount@microsoft.com. Must be owner on the subscription you're deploying to during template deployment."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "azureAdminPwd": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Enter the password for the service admin user. The pwd is encrypted during runtime and in the Automation assets"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "AzureRM.Profile": {
+ "name": "AzureRm.Profile",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.profile.2.8.0.nupkg"
+ },
+ "psModules": [
+ {
+ "name": "AzureRM.Compute",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.compute.2.9.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Resources",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.resources.3.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.KeyVault",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.keyvault.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Automation",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.automation.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.OperationalInsights",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.operationalinsights.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.SiteRecovery",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.siterecovery.3.7.0.nupkg"
+ },
+ {
+ "name": "AzureRm.RecoveryServices",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.recoveryservices.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Backup",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.backup.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Insights",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.insights.2.8.0.nupkg"
+ }
+ ],
+ "runbooks": [
+ {
+ "name": "Bootstrap_Main",
+ "version": "1.0.0.0",
+ "description": "Configurates Azure Automation account for anything we can't handle in ARM",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Bootstrap_Main.ps1', parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "SequencedSnooze_Parent",
+ "version": "1.0.0.0",
+ "description": "Sequenced Snooze(stop) or UnSnooze(start)",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/SequencedSnooze/SequencedSnooze_Parent.ps1', parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "DisableAllOptimizations",
+ "version": "1.0.0.0",
+ "description": "Abort the ARO Toolkit",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/DisableAllOptimizations.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AROToolkit_AutoUpdate",
+ "version": "1.0.0.0",
+ "description": "Autoupdate the ARO Toolkit",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/AROToolkit_AutoUpdate.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "ScheduledSnooze_Parent",
+ "version": "1.0.0.0",
+ "description": "Parallel execution of scheduled snooze actions",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/ScheduleSnooze/ScheduledSnooze_Parent.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "ScheduledSnooze_Child",
+ "version": "1.0.0.0",
+ "description": "Placeholder",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/ScheduleSnooze/ScheduledSnooze_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_StopVM_Child",
+ "version": "1.0.0.0",
+ "description": "Runbook to stop indivual ARM VM, called by CreateAlertsForAzureRmVM",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_StopVM_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_CreateAlert_Parent",
+ "version": "1.0.0.0",
+ "description": "Runbook to create alerts for AutoSnooze",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_CreateAlert_Parent.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_CreateAlert_Child",
+ "version": "1.0.0.0",
+ "description": "Runbook to create or disable alert for AutoSnooze",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_CreateAlert_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_Disable",
+ "version": "1.0.0.0",
+ "description": "Disable the AutoSnooze",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_Disable.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "DeleteResourceGroups_Parent",
+ "version": "1.0.0.0",
+ "description": "This runbook will delete resource groups",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/DeleteRG/DeleteResourceGroups_Parent.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "DeleteResourceGroup_Child",
+ "version": "1.0.0.0",
+ "description": "This runbook will delete resource groups",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/DeleteRG/DeleteResourceGroup_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ }
+ ],
+ "internalAzureSubscriptionId": {
+ "name": "Internal_AzureSubscriptionId",
+ "description": "Azure Subscription Id",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ },
+ "automationVariables": [
+ {
+ "name": "Internal_AROAutomationAccountName",
+ "description": "OMS Azure Automation Account Name",
+ "value": "\"[concat('aa-', uniqueString(resourceGroup().id))]\""
+ },
+ {
+ "name": "Internal_AROResourceGroupName",
+ "description": "ARO Azure Automation Account resource group name",
+ "value": "[concat('\"',resourceGroup().name,'\"')]"
+ },
+ {
+ "name": "External_ExcludeVMNames",
+ "description": "Excluded VMs as comma separated list: vm1,vm2,vm3",
+ "value": "\"\""
+ },
+ {
+ "name": "External_ResourceGroupNames",
+ "description": "Resource groups (as comma seperated) targeted for Snooze actions: rg1,rg2,rg3",
+ "value": "\"\""
+ },
+ {
+ "name": "External_AutoSnooze_Condition",
+ "description": "This is the conditional operator required for configuring the condition before triggering an alert. Possible values are [GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual]",
+ "value": "\"LessThan\""
+ },
+ {
+ "name": "External_AutoSnooze_Description",
+ "description": "Alert to stop the VM if the CPU % exceed the threshold",
+ "value": "\"Alert to stop the VM if the CPU % exceed the threshold\""
+ },
+ {
+ "name": "External_AutoSnooze_MetricName",
+ "description": "Name of the metric the Azure Alert rule is to be configured for",
+ "value": "\"Percentage CPU\""
+ },
+ {
+ "name": "External_AutoSnooze_Threshold",
+ "description": "Threshold for the Azure Alert rule. Possible percentage values ranging from 1 to 100",
+ "value": "\"5\""
+ },
+ {
+ "name": "External_AutoSnooze_TimeAggregationOperator",
+ "description": "The time aggregation operator which will be applied to the selected window size to evaluate the condition. Possible values are [Average, Minimum, Maximum, Total, Last]",
+ "value": "\"Average\""
+ },
+ {
+ "name": "External_AutoSnooze_TimeWindow",
+ "description": "The window size over which Azure will analyze selected metric for triggering an alert. This parameter accepts input in timespan format. Possible values are from 5 mins to 6 hours.",
+ "value": "\"06:00:00\""
+ }
+ ],
+ "azureCredentials": "AzureCredentials",
+ "AROToolkitVersion": "1.0.0.0"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2021-04-01",
+ "location": "eastus2",
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]",
+ "tags": {
+ "AROToolkitVersion": "1.0.0.0"
+ },
+ "comments": "Automation account",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/(internalAzureSubscriptionId).name",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(internalAzureSubscriptionId).description",
+ "isEncrypted": true,
+ "type": "string",
+ "value": "(internalAzureSubscriptionId).value"
+ }
+ },
+ {
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/AzureCredentials",
+ "type": "Microsoft.Automation/automationAccounts/credentials",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "Azure Subscription Credentials",
+ "password": "GEN-PASSWORD",
+ "userName": "GEN-UNIQUE"
+ }
+ },
+ {
+ "comments": "provision the AzureRM.Profile module first since others are depenedent on it",
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/(AzureRM.Profile).name",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(AzureRM.Profile).url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/startBootstrap",
+ "type": "Microsoft.Automation/automationAccounts/schedules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(runbooks)[0].name"
+ ],
+ "properties": {
+ "description": "Starts the bootstrap runbooks",
+ "expiryTime": "9999-12-31T17:59:00-06:00",
+ "isEnabled": true,
+ "frequency": "OneTime"
+ }
+ },
+ {
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/[newGuid()]",
+ "type": "Microsoft.Automation/automationAccounts/jobSchedules",
+ "apiVersion": "2021-04-01",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "startBootstrap",
+ "modulesLoop"
+ ],
+ "properties": {
+ "schedule": {
+ "name": "startBootstrap"
+ },
+ "runbook": {
+ "name": "Bootstrap_Main"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT636 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT636
new file mode 100644
index 0000000..7fc5ada
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT636
@@ -0,0 +1,908 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.json",
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962898436,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.json",
+ "/demos/azure-resource-optimization-toolkit/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT636",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts/schedules",
+ "microsoft.automation/automationaccounts/jobschedules",
+ "microsoft.automation/automationaccounts/credentials",
+ "microsoft.automation/automationaccounts/runbooks",
+ "microsoft.automation/automationaccounts/modules",
+ "microsoft.automation/automationaccounts",
+ "microsoft.automation/automationaccounts/variables"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT636",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "newGuid": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "Enter new GUID, you can generate one from Powershell using new-guid or get one from this site: GUID Generator"
+ }
+ },
+ "automationAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('aa-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Assign a name for the Automation account of your choosing. Must be a unique name as Azure Automation accounts are FQDNs"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specify the region for your Automation account"
+ },
+ "value": "usgovtexas"
+ },
+ "azureAdmin": {
+ "type": "string",
+ "metadata": {
+ "description": "Enter your service admin user, ex: serviceaccount@microsoft.com. Must be owner on the subscription you're deploying to during template deployment."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "azureAdminPwd": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Enter the password for the service admin user. The pwd is encrypted during runtime and in the Automation assets"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "AzureRM.Profile": {
+ "name": "AzureRm.Profile",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.profile.2.8.0.nupkg"
+ },
+ "psModules": [
+ {
+ "name": "AzureRM.Compute",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.compute.2.9.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Resources",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.resources.3.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.KeyVault",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.keyvault.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Automation",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.automation.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.OperationalInsights",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.operationalinsights.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.SiteRecovery",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.siterecovery.3.7.0.nupkg"
+ },
+ {
+ "name": "AzureRm.RecoveryServices",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.recoveryservices.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Backup",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.backup.2.8.0.nupkg"
+ },
+ {
+ "name": "AzureRm.Insights",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.insights.2.8.0.nupkg"
+ }
+ ],
+ "runbooks": [
+ {
+ "name": "Bootstrap_Main",
+ "version": "1.0.0.0",
+ "description": "Configurates Azure Automation account for anything we can't handle in ARM",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Bootstrap_Main.ps1', parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "SequencedSnooze_Parent",
+ "version": "1.0.0.0",
+ "description": "Sequenced Snooze(stop) or UnSnooze(start)",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/SequencedSnooze/SequencedSnooze_Parent.ps1', parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "DisableAllOptimizations",
+ "version": "1.0.0.0",
+ "description": "Abort the ARO Toolkit",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/DisableAllOptimizations.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AROToolkit_AutoUpdate",
+ "version": "1.0.0.0",
+ "description": "Autoupdate the ARO Toolkit",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/AROToolkit_AutoUpdate.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "ScheduledSnooze_Parent",
+ "version": "1.0.0.0",
+ "description": "Parallel execution of scheduled snooze actions",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/ScheduleSnooze/ScheduledSnooze_Parent.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "ScheduledSnooze_Child",
+ "version": "1.0.0.0",
+ "description": "Placeholder",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/ScheduleSnooze/ScheduledSnooze_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_StopVM_Child",
+ "version": "1.0.0.0",
+ "description": "Runbook to stop indivual ARM VM, called by CreateAlertsForAzureRmVM",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_StopVM_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_CreateAlert_Parent",
+ "version": "1.0.0.0",
+ "description": "Runbook to create alerts for AutoSnooze",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_CreateAlert_Parent.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_CreateAlert_Child",
+ "version": "1.0.0.0",
+ "description": "Runbook to create or disable alert for AutoSnooze",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_CreateAlert_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "AutoSnooze_Disable",
+ "version": "1.0.0.0",
+ "description": "Disable the AutoSnooze",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Snooze/AutoSnooze_Disable.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "DeleteResourceGroups_Parent",
+ "version": "1.0.0.0",
+ "description": "This runbook will delete resource groups",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/DeleteRG/DeleteResourceGroups_Parent.ps1',parameters('_artifactsLocationSasToken')))]"
+ },
+ {
+ "name": "DeleteResourceGroup_Child",
+ "version": "1.0.0.0",
+ "description": "This runbook will delete resource groups",
+ "type": "PowerShell",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/DeleteRG/DeleteResourceGroup_Child.ps1',parameters('_artifactsLocationSasToken')))]"
+ }
+ ],
+ "internalAzureSubscriptionId": {
+ "name": "Internal_AzureSubscriptionId",
+ "description": "Azure Subscription Id",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ },
+ "automationVariables": [
+ {
+ "name": "Internal_AROAutomationAccountName",
+ "description": "OMS Azure Automation Account Name",
+ "value": "\"[concat('aa-', uniqueString(resourceGroup().id))]\""
+ },
+ {
+ "name": "Internal_AROResourceGroupName",
+ "description": "ARO Azure Automation Account resource group name",
+ "value": "[concat('\"',resourceGroup().name,'\"')]"
+ },
+ {
+ "name": "External_ExcludeVMNames",
+ "description": "Excluded VMs as comma separated list: vm1,vm2,vm3",
+ "value": "\"\""
+ },
+ {
+ "name": "External_ResourceGroupNames",
+ "description": "Resource groups (as comma seperated) targeted for Snooze actions: rg1,rg2,rg3",
+ "value": "\"\""
+ },
+ {
+ "name": "External_AutoSnooze_Condition",
+ "description": "This is the conditional operator required for configuring the condition before triggering an alert. Possible values are [GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual]",
+ "value": "\"LessThan\""
+ },
+ {
+ "name": "External_AutoSnooze_Description",
+ "description": "Alert to stop the VM if the CPU % exceed the threshold",
+ "value": "\"Alert to stop the VM if the CPU % exceed the threshold\""
+ },
+ {
+ "name": "External_AutoSnooze_MetricName",
+ "description": "Name of the metric the Azure Alert rule is to be configured for",
+ "value": "\"Percentage CPU\""
+ },
+ {
+ "name": "External_AutoSnooze_Threshold",
+ "description": "Threshold for the Azure Alert rule. Possible percentage values ranging from 1 to 100",
+ "value": "\"5\""
+ },
+ {
+ "name": "External_AutoSnooze_TimeAggregationOperator",
+ "description": "The time aggregation operator which will be applied to the selected window size to evaluate the condition. Possible values are [Average, Minimum, Maximum, Total, Last]",
+ "value": "\"Average\""
+ },
+ {
+ "name": "External_AutoSnooze_TimeWindow",
+ "description": "The window size over which Azure will analyze selected metric for triggering an alert. This parameter accepts input in timespan format. Possible values are from 5 mins to 6 hours.",
+ "value": "\"06:00:00\""
+ }
+ ],
+ "azureCredentials": "AzureCredentials",
+ "AROToolkitVersion": "1.0.0.0"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2021-04-01",
+ "location": "usgovtexas",
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]",
+ "tags": {
+ "AROToolkitVersion": "1.0.0.0"
+ },
+ "comments": "Automation account",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(parameters('automationAccountName'), '/', variables('automationVariables')[copyIndex()].name)]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(automationVariables)[copyIndex()].description",
+ "value": "(automationVariables)[copyIndex()].value"
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts/variables",
+ "apiVersion": "2021-04-01",
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/(internalAzureSubscriptionId).name",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "(internalAzureSubscriptionId).description",
+ "isEncrypted": true,
+ "type": "string",
+ "value": "(internalAzureSubscriptionId).value"
+ }
+ },
+ {
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/AzureCredentials",
+ "type": "Microsoft.Automation/automationAccounts/credentials",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "description": "Azure Subscription Credentials",
+ "password": "GEN-PASSWORD",
+ "userName": "GEN-UNIQUE"
+ }
+ },
+ {
+ "comments": "provision the AzureRM.Profile module first since others are depenedent on it",
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/(AzureRM.Profile).name",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(AzureRM.Profile).url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('psModules')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/modules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules)[copyIndex()].url"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('automationAccountName'), '/', variables('runbooks')[copyIndex()].name)]",
+ "type": "Microsoft.Automation/automationAccounts/runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(AzureRM.Profile).name",
+ "modulesLoop"
+ ],
+ "tags": {
+ "version": "(runbooks)[copyIndex()].version"
+ },
+ "properties": {
+ "runbookType": "(runbooks)[copyIndex()].type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks)[copyIndex()].description",
+ "publishContentLink": {
+ "uri": "(runbooks)[copyIndex()].scriptUri",
+ "version": "(runbooks)[copyIndex()].version"
+ }
+ }
+ },
+ {
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/startBootstrap",
+ "type": "Microsoft.Automation/automationAccounts/schedules",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "(runbooks)[0].name"
+ ],
+ "properties": {
+ "description": "Starts the bootstrap runbooks",
+ "expiryTime": "9999-12-31T17:59:00-06:00",
+ "isEnabled": true,
+ "frequency": "OneTime"
+ }
+ },
+ {
+ "name": "[concat('aa-', uniqueString(resourceGroup().id))]/[newGuid()]",
+ "type": "Microsoft.Automation/automationAccounts/jobSchedules",
+ "apiVersion": "2021-04-01",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/[concat('aa-', uniqueString(resourceGroup().id))]",
+ "startBootstrap",
+ "modulesLoop"
+ ],
+ "properties": {
+ "schedule": {
+ "name": "startBootstrap"
+ },
+ "runbook": {
+ "name": "Bootstrap_Main"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT637 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT637
new file mode 100644
index 0000000..b456996
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT637
@@ -0,0 +1,239 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-sql-managed-instance/nestedtemplates/vnet.json"
+ ],
+ "timestamp": 1642962898447,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-sql-managed-instance/nestedtemplates/vnet.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT637",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.network/routetables"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT637",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources"
+ }
+ },
+ "vnetResourceName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the vnet"
+ }
+ },
+ "vnetAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "Address range of the virtual network"
+ }
+ },
+ "managedInstanceSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Managed Instance Subnet name"
+ }
+ },
+ "managedInstanceSubnetAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "Managed Instance Subnet range"
+ }
+ },
+ "managedInstanceNSGName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Managed Instance NSG"
+ }
+ },
+ "managedInstanceRouteTableName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Managed Instance Route Table"
+ }
+ },
+ "miManagementIps": {
+ "type": "array",
+ "metadata": {
+ "description": "List of MI management IP ranges"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-11-01",
+ "location": "location",
+ "name": "managedInstanceNsgName",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "allow-management-outbound",
+ "properties": {
+ "description": "Allow outbound management TCP traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443",
+ "12000"
+ ]
+ }
+ },
+ {
+ "name": "inbound-management",
+ "properties": {
+ "description": "Management ports for the Managed Instance",
+ "protocol": "TCP",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "SqlManagement",
+ "destinationAddressPrefix": "managedInstanceSubnetAddressRange",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound",
+ "destinationPortRanges": [
+ "9000",
+ "9003",
+ "1438",
+ "1440",
+ "1452"
+ ]
+ }
+ },
+ {
+ "name": "outbound-mi-subnet",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "managedInstanceSubnetAddressRange",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "inbound-mi-subnet",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "managedInstanceSubnetAddressRange",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "inbound-health-probe",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/routeTables",
+ "apiVersion": "2019-11-01",
+ "name": "managedInstanceRouteTableName",
+ "location": "location",
+ "tags": {
+ "displayName": "Deploy Azure SQL Managed Instance UDR"
+ },
+ "properties": {
+ "copy": [
+ {
+ "name": "routes",
+ "count": 29,
+ "input": {
+ "name": "[if(equals(copyIndex('routes'),0),'subnet_to_vnetlocal',concat(replace(parameters('miManagementIps')[copyIndex('routes')],'/','-'),'-next-hop-internet-route'))]",
+ "properties": {
+ "addressPrefix": "[if(equals(copyIndex('routes'),0),parameters('managedInstanceSubnetAddressRange'),parameters('miManagementIps')[copyIndex('routes')])]",
+ "nextHopType": "[if(equals(copyIndex('routes'),0),'VnetLocal','Internet')]"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2019-11-01",
+ "name": "vnetResourceName",
+ "location": "location",
+ "tags": {
+ "displayName": "Deploy VNet"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/managedInstanceNSGName",
+ "Microsoft.Network/routeTables/managedInstanceRouteTableName"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "vnetAddressRange"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "managedInstanceSubnetName",
+ "properties": {
+ "addressPrefix": "managedInstanceSubnetAddressRange",
+ "routeTable": {
+ "id": "Microsoft.Network/routeTables/managedInstanceRouteTableName"
+ },
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/managedInstanceNSGName"
+ },
+ "delegations": [
+ {
+ "properties": {
+ "serviceName": "Microsoft.Sql/managedInstances"
+ },
+ "name": "managedInstanceSubnetName-delegation"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT638 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT638
new file mode 100644
index 0000000..0aabbd7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT638
@@ -0,0 +1,788 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/azure-sql-managed-instance/azuredeploy.json",
+ "/demos/azure-sql-managed-instance/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898455,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/azure-sql-managed-instance/azuredeploy.json",
+ "/demos/azure-sql-managed-instance/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT638",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.sql/managedinstances"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT638",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources"
+ }
+ },
+ "vnetResourceName": {
+ "type": "string",
+ "defaultValue": "virtualNetwork",
+ "metadata": {
+ "description": "The name of the vnet"
+ }
+ },
+ "managedInstanceSubnetName": {
+ "type": "string",
+ "defaultValue": "mi-subnet",
+ "metadata": {
+ "description": "Managed Instance Subnet name"
+ }
+ },
+ "sqlManagedInstanceName": {
+ "type": "string",
+ "defaultValue": "[concat('managedInstance-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the Azure SQL Managed Instance - must be globally unique, contain only lowercase letters, numbers and '-'"
+ }
+ },
+ "sqlManagedInstanceAdminLogin": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin user for Managed Instance"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sqlManagedInstancePassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin user password - must be 16-128 characters, must contain 3 of uppercase, lowercase, numbers and non-alphanumeric characters, and cannot contain all or part of the login name"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sqlManagedInstance-storageSizeInGB": {
+ "type": "string",
+ "defaultValue": "256",
+ "metadata": {
+ "description": "Amount of Storage in GB for this instance"
+ }
+ },
+ "sqlManagedInstance-vCores": {
+ "type": "string",
+ "defaultValue": "8",
+ "metadata": {
+ "description": "Number of vCores for this instance"
+ }
+ },
+ "sqlManagedInstance-licenseType": {
+ "type": "string",
+ "defaultValue": "BasePrice",
+ "metadata": {
+ "description": "Type of license: BasePrice (BYOL) or LicenceIncluded"
+ },
+ "allowedValues": [
+ "BasePrice",
+ "LicenseIncluded"
+ ]
+ },
+ "sqlManagedInstance-skuName": {
+ "type": "string",
+ "defaultValue": "GP_Gen5",
+ "metadata": {
+ "description": "SKU NAME (GP_Gen4, GP_Gen5, BC_GEN5)"
+ },
+ "allowedValues": [
+ "GP_Gen4",
+ "GP_Gen5",
+ "BC_Gen4",
+ "BC_Gen5"
+ ]
+ },
+ "sqlManagedInstance-skuEdition": {
+ "type": "string",
+ "defaultValue": "GeneralPurpose",
+ "metadata": {
+ "description": "SKU Edition (GeneralPurpose, BusinessCritical) "
+ },
+ "allowedValues": [
+ "GeneralPurpose",
+ "BusinessCritical"
+ ]
+ },
+ "sqlManagedInstance-hardwareFamily": {
+ "type": "string",
+ "defaultValue": "Gen5",
+ "metadata": {
+ "description": "Hardware family (Gen4, Gen5)"
+ },
+ "allowedValues": [
+ "Gen4",
+ "Gen5"
+ ]
+ },
+ "sqlManagedInstance-collation": {
+ "type": "string",
+ "defaultValue": "SQL_Latin1_General_CP1_CI_AS",
+ "metadata": {
+ "description": "SQL Collation"
+ }
+ },
+ "tags": {
+ "type": "object",
+ "defaultValue": {},
+ "metadata": {
+ "description": "Tags for the Managed Instance SQL resource."
+ },
+ "value": {
+ "tag1": "value1",
+ "tag2": "value2"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ },
+ "defaultValue": ""
+ },
+ "vnetAddressRange": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Address range for the virtual network in CIDR notation"
+ }
+ },
+ "managedInstanceNSGName": {
+ "type": "string",
+ "defaultValue": "mi-NSG",
+ "metadata": {
+ "description": "Name of the Managed Instance NSG"
+ }
+ },
+ "managedInstanceRouteTableName": {
+ "type": "string",
+ "defaultValue": "mi-RouteTable",
+ "metadata": {
+ "description": "Name of the Managed Instance Route Table"
+ }
+ },
+ "managedInstanceSubnetAddressRange": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Managed Instance Subnet range"
+ }
+ },
+ "miManagementIps": {
+ "type": "array",
+ "defaultValue": [
+ "vnetLocalRoute",
+ "13.64.0.0/11",
+ "13.104.0.0/14",
+ "20.33.0.0/16",
+ "20.34.0.0/15",
+ "20.36.0.0/14",
+ "20.40.0.0/13",
+ "20.48.0.0/12",
+ "20.64.0.0/10",
+ "20.128.0.0/16",
+ "20.135.0.0/16",
+ "20.136.0.0/16",
+ "20.140.0.0/15",
+ "20.143.0.0/16",
+ "20.144.0.0/14",
+ "20.150.0.0/15",
+ "20.160.0.0/12",
+ "20.176.0.0/14",
+ "20.180.0.0/14",
+ "20.184.0.0/13",
+ "20.192.0.0/10",
+ "40.64.0.0/10",
+ "51.4.0.0/15",
+ "51.8.0.0/16",
+ "51.10.0.0/15",
+ "51.18.0.0/16",
+ "51.51.0.0/16",
+ "51.53.0.0/16",
+ "51.103.0.0/16",
+ "51.104.0.0/15",
+ "51.132.0.0/16",
+ "51.136.0.0/15",
+ "51.138.0.0/16",
+ "51.140.0.0/14",
+ "51.144.0.0/15",
+ "52.96.0.0/12",
+ "52.112.0.0/14",
+ "52.125.0.0/16",
+ "52.126.0.0/15",
+ "52.130.0.0/15",
+ "52.132.0.0/14",
+ "52.136.0.0/13",
+ "52.145.0.0/16",
+ "52.146.0.0/15",
+ "52.148.0.0/14",
+ "52.152.0.0/13",
+ "52.160.0.0/11",
+ "52.224.0.0/11",
+ "64.4.0.0/18",
+ "65.52.0.0/14",
+ "66.119.144.0/20",
+ "70.37.0.0/17",
+ "70.37.128.0/18",
+ "91.190.216.0/21",
+ "94.245.64.0/18",
+ "103.9.8.0/22",
+ "103.25.156.0/24",
+ "103.25.157.0/24",
+ "103.25.158.0/23",
+ "103.36.96.0/22",
+ "103.255.140.0/22",
+ "104.40.0.0/13",
+ "104.146.0.0/15",
+ "104.208.0.0/13",
+ "111.221.16.0/20",
+ "111.221.64.0/18",
+ "129.75.0.0/16",
+ "131.107.0.0/16",
+ "131.253.1.0/24",
+ "131.253.3.0/24",
+ "131.253.5.0/24",
+ "131.253.6.0/24",
+ "131.253.8.0/24",
+ "131.253.12.0/22",
+ "131.253.16.0/23",
+ "131.253.18.0/24",
+ "131.253.21.0/24",
+ "131.253.22.0/23",
+ "131.253.24.0/21",
+ "131.253.32.0/20",
+ "131.253.61.0/24",
+ "131.253.62.0/23",
+ "131.253.64.0/18",
+ "131.253.128.0/17",
+ "132.245.0.0/16",
+ "134.170.0.0/16",
+ "134.177.0.0/16",
+ "137.116.0.0/15",
+ "137.135.0.0/16",
+ "138.91.0.0/16",
+ "138.196.0.0/16",
+ "139.217.0.0/16",
+ "139.219.0.0/16",
+ "141.251.0.0/16",
+ "146.147.0.0/16",
+ "147.243.0.0/16",
+ "150.171.0.0/16",
+ "150.242.48.0/22",
+ "157.54.0.0/15",
+ "157.56.0.0/14",
+ "157.60.0.0/16",
+ "167.105.0.0/16",
+ "167.220.0.0/16",
+ "168.61.0.0/16",
+ "168.62.0.0/15",
+ "191.232.0.0/13",
+ "192.32.0.0/16",
+ "192.48.225.0/24",
+ "192.84.159.0/24",
+ "192.84.160.0/23",
+ "192.197.157.0/24",
+ "193.149.64.0/19",
+ "193.221.113.0/24",
+ "194.69.96.0/19",
+ "194.110.197.0/24",
+ "198.105.232.0/22",
+ "198.200.130.0/24",
+ "198.206.164.0/24",
+ "199.60.28.0/24",
+ "199.74.210.0/24",
+ "199.103.90.0/23",
+ "199.103.122.0/24",
+ "199.242.32.0/20",
+ "199.242.48.0/21",
+ "202.89.224.0/20",
+ "204.13.120.0/21",
+ "204.14.180.0/22",
+ "204.79.135.0/24",
+ "204.79.179.0/24",
+ "204.79.181.0/24",
+ "204.79.188.0/24",
+ "204.79.195.0/24",
+ "204.79.196.0/23",
+ "204.79.252.0/24",
+ "204.152.18.0/23",
+ "204.152.140.0/23",
+ "204.231.192.0/24",
+ "204.231.194.0/23",
+ "204.231.197.0/24",
+ "204.231.198.0/23",
+ "204.231.200.0/21",
+ "204.231.208.0/20",
+ "204.231.236.0/24",
+ "205.174.224.0/20",
+ "206.138.168.0/21",
+ "206.191.224.0/19",
+ "207.46.0.0/16",
+ "207.68.128.0/18",
+ "208.68.136.0/21",
+ "208.76.44.0/22",
+ "208.84.0.0/21",
+ "209.240.192.0/19",
+ "213.199.128.0/18",
+ "216.32.180.0/22",
+ "216.220.208.0/20",
+ "23.96.0.0/13",
+ "42.159.0.0/16",
+ "51.13.0.0/17",
+ "51.107.0.0/16",
+ "51.116.0.0/16",
+ "51.120.0.0/16",
+ "51.120.128.0/17",
+ "51.124.0.0/16",
+ "102.37.0.0/18",
+ "102.133.0.0/16",
+ "199.30.16.0/20",
+ "204.79.180.0/24"
+ ],
+ "metadata": {
+ "description": "List of MI management IP ranges"
+ }
+ },
+ "miManagementIPs": {
+ "value": [
+ "vnetLocalRoute",
+ "13.64.0.0/11",
+ "13.104.0.0/14",
+ "20.33.0.0/16",
+ "20.34.0.0/15",
+ "20.36.0.0/14",
+ "20.40.0.0/13",
+ "20.48.0.0/12",
+ "20.64.0.0/10",
+ "20.128.0.0/16",
+ "20.135.0.0/16",
+ "20.136.0.0/16",
+ "20.140.0.0/15",
+ "20.143.0.0/16",
+ "20.144.0.0/14",
+ "20.150.0.0/15",
+ "20.160.0.0/12",
+ "20.176.0.0/14",
+ "20.180.0.0/14",
+ "20.184.0.0/13",
+ "20.192.0.0/10",
+ "40.64.0.0/10",
+ "51.4.0.0/15",
+ "51.8.0.0/16",
+ "51.10.0.0/15",
+ "51.18.0.0/16",
+ "51.51.0.0/16",
+ "51.53.0.0/16",
+ "51.103.0.0/16",
+ "51.104.0.0/15",
+ "51.132.0.0/16",
+ "51.136.0.0/15",
+ "51.138.0.0/16",
+ "51.140.0.0/14",
+ "51.144.0.0/15",
+ "52.96.0.0/12",
+ "52.112.0.0/14",
+ "52.125.0.0/16",
+ "52.126.0.0/15",
+ "52.130.0.0/15",
+ "52.132.0.0/14",
+ "52.136.0.0/13",
+ "52.145.0.0/16",
+ "52.146.0.0/15",
+ "52.148.0.0/14",
+ "52.152.0.0/13",
+ "52.160.0.0/11",
+ "52.224.0.0/11",
+ "64.4.0.0/18",
+ "65.52.0.0/14",
+ "66.119.144.0/20",
+ "70.37.0.0/17",
+ "70.37.128.0/18",
+ "91.190.216.0/21",
+ "94.245.64.0/18",
+ "103.9.8.0/22",
+ "103.25.156.0/24",
+ "103.25.157.0/24",
+ "103.25.158.0/23",
+ "103.36.96.0/22",
+ "103.255.140.0/22",
+ "104.40.0.0/13",
+ "104.146.0.0/15",
+ "104.208.0.0/13",
+ "111.221.16.0/20",
+ "111.221.64.0/18",
+ "129.75.0.0/16",
+ "131.107.0.0/16",
+ "131.253.1.0/24",
+ "131.253.3.0/24",
+ "131.253.5.0/24",
+ "131.253.6.0/24",
+ "131.253.8.0/24",
+ "131.253.12.0/22",
+ "131.253.16.0/23",
+ "131.253.18.0/24",
+ "131.253.21.0/24",
+ "131.253.22.0/23",
+ "131.253.24.0/21",
+ "131.253.32.0/20",
+ "131.253.61.0/24",
+ "131.253.62.0/23",
+ "131.253.64.0/18",
+ "131.253.128.0/17",
+ "132.245.0.0/16",
+ "134.170.0.0/16",
+ "134.177.0.0/16",
+ "137.116.0.0/15",
+ "137.135.0.0/16",
+ "138.91.0.0/16",
+ "138.196.0.0/16",
+ "139.217.0.0/16",
+ "139.219.0.0/16",
+ "141.251.0.0/16",
+ "146.147.0.0/16",
+ "147.243.0.0/16",
+ "150.171.0.0/16",
+ "150.242.48.0/22",
+ "157.54.0.0/15",
+ "157.56.0.0/14",
+ "157.60.0.0/16",
+ "167.105.0.0/16",
+ "167.220.0.0/16",
+ "168.61.0.0/16",
+ "168.62.0.0/15",
+ "191.232.0.0/13",
+ "192.32.0.0/16",
+ "192.48.225.0/24",
+ "192.84.159.0/24",
+ "192.84.160.0/23",
+ "192.197.157.0/24",
+ "193.149.64.0/19",
+ "193.221.113.0/24",
+ "194.69.96.0/19",
+ "194.110.197.0/24",
+ "198.105.232.0/22",
+ "198.200.130.0/24",
+ "198.206.164.0/24",
+ "199.60.28.0/24",
+ "199.74.210.0/24",
+ "199.103.90.0/23",
+ "199.103.122.0/24",
+ "199.242.32.0/20",
+ "199.242.48.0/21",
+ "202.89.224.0/20",
+ "204.13.120.0/21",
+ "204.14.180.0/22",
+ "204.79.135.0/24",
+ "204.79.179.0/24",
+ "204.79.181.0/24",
+ "204.79.188.0/24",
+ "204.79.195.0/24",
+ "204.79.196.0/23",
+ "204.79.252.0/24",
+ "204.152.18.0/23",
+ "204.152.140.0/23",
+ "204.231.192.0/24",
+ "204.231.194.0/23",
+ "204.231.197.0/24",
+ "204.231.198.0/23",
+ "204.231.200.0/21",
+ "204.231.208.0/20",
+ "204.231.236.0/24",
+ "205.174.224.0/20",
+ "206.138.168.0/21",
+ "206.191.224.0/19",
+ "207.46.0.0/16",
+ "207.68.128.0/18",
+ "208.68.136.0/21",
+ "208.76.44.0/22",
+ "208.84.0.0/21",
+ "209.240.192.0/19",
+ "213.199.128.0/18",
+ "216.32.180.0/22",
+ "216.220.208.0/20",
+ "23.96.0.0/13",
+ "42.159.0.0/16",
+ "51.13.0.0/17",
+ "51.107.0.0/16",
+ "51.116.0.0/16",
+ "51.120.0.0/16",
+ "51.120.128.0/17",
+ "51.124.0.0/16",
+ "102.37.0.0/18",
+ "102.133.0.0/16",
+ "199.30.16.0/20",
+ "204.79.180.0/24"
+ ]
+ }
+ },
+ "variables": {
+ "nestedtemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "BuildMINetworking",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "nestedTemplateUri",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vnetResourceName": {
+ "value": "virtualNetwork"
+ },
+ "vnetAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "managedInstanceSubnetName": {
+ "value": "mi-subnet"
+ },
+ "managedInstanceSubnetAddressRange": {
+ "value": "10.0.0.0/24"
+ },
+ "managedInstanceNSGName": {
+ "value": "mi-NSG"
+ },
+ "managedInstanceRouteTableName": {
+ "value": "mi-RouteTable"
+ },
+ "miManagementIps": {
+ "value": [
+ "vnetLocalRoute",
+ "13.64.0.0/11",
+ "13.104.0.0/14",
+ "20.33.0.0/16",
+ "20.34.0.0/15",
+ "20.36.0.0/14",
+ "20.40.0.0/13",
+ "20.48.0.0/12",
+ "20.64.0.0/10",
+ "20.128.0.0/16",
+ "20.135.0.0/16",
+ "20.136.0.0/16",
+ "20.140.0.0/15",
+ "20.143.0.0/16",
+ "20.144.0.0/14",
+ "20.150.0.0/15",
+ "20.160.0.0/12",
+ "20.176.0.0/14",
+ "20.180.0.0/14",
+ "20.184.0.0/13",
+ "20.192.0.0/10",
+ "40.64.0.0/10",
+ "51.4.0.0/15",
+ "51.8.0.0/16",
+ "51.10.0.0/15",
+ "51.18.0.0/16",
+ "51.51.0.0/16",
+ "51.53.0.0/16",
+ "51.103.0.0/16",
+ "51.104.0.0/15",
+ "51.132.0.0/16",
+ "51.136.0.0/15",
+ "51.138.0.0/16",
+ "51.140.0.0/14",
+ "51.144.0.0/15",
+ "52.96.0.0/12",
+ "52.112.0.0/14",
+ "52.125.0.0/16",
+ "52.126.0.0/15",
+ "52.130.0.0/15",
+ "52.132.0.0/14",
+ "52.136.0.0/13",
+ "52.145.0.0/16",
+ "52.146.0.0/15",
+ "52.148.0.0/14",
+ "52.152.0.0/13",
+ "52.160.0.0/11",
+ "52.224.0.0/11",
+ "64.4.0.0/18",
+ "65.52.0.0/14",
+ "66.119.144.0/20",
+ "70.37.0.0/17",
+ "70.37.128.0/18",
+ "91.190.216.0/21",
+ "94.245.64.0/18",
+ "103.9.8.0/22",
+ "103.25.156.0/24",
+ "103.25.157.0/24",
+ "103.25.158.0/23",
+ "103.36.96.0/22",
+ "103.255.140.0/22",
+ "104.40.0.0/13",
+ "104.146.0.0/15",
+ "104.208.0.0/13",
+ "111.221.16.0/20",
+ "111.221.64.0/18",
+ "129.75.0.0/16",
+ "131.107.0.0/16",
+ "131.253.1.0/24",
+ "131.253.3.0/24",
+ "131.253.5.0/24",
+ "131.253.6.0/24",
+ "131.253.8.0/24",
+ "131.253.12.0/22",
+ "131.253.16.0/23",
+ "131.253.18.0/24",
+ "131.253.21.0/24",
+ "131.253.22.0/23",
+ "131.253.24.0/21",
+ "131.253.32.0/20",
+ "131.253.61.0/24",
+ "131.253.62.0/23",
+ "131.253.64.0/18",
+ "131.253.128.0/17",
+ "132.245.0.0/16",
+ "134.170.0.0/16",
+ "134.177.0.0/16",
+ "137.116.0.0/15",
+ "137.135.0.0/16",
+ "138.91.0.0/16",
+ "138.196.0.0/16",
+ "139.217.0.0/16",
+ "139.219.0.0/16",
+ "141.251.0.0/16",
+ "146.147.0.0/16",
+ "147.243.0.0/16",
+ "150.171.0.0/16",
+ "150.242.48.0/22",
+ "157.54.0.0/15",
+ "157.56.0.0/14",
+ "157.60.0.0/16",
+ "167.105.0.0/16",
+ "167.220.0.0/16",
+ "168.61.0.0/16",
+ "168.62.0.0/15",
+ "191.232.0.0/13",
+ "192.32.0.0/16",
+ "192.48.225.0/24",
+ "192.84.159.0/24",
+ "192.84.160.0/23",
+ "192.197.157.0/24",
+ "193.149.64.0/19",
+ "193.221.113.0/24",
+ "194.69.96.0/19",
+ "194.110.197.0/24",
+ "198.105.232.0/22",
+ "198.200.130.0/24",
+ "198.206.164.0/24",
+ "199.60.28.0/24",
+ "199.74.210.0/24",
+ "199.103.90.0/23",
+ "199.103.122.0/24",
+ "199.242.32.0/20",
+ "199.242.48.0/21",
+ "202.89.224.0/20",
+ "204.13.120.0/21",
+ "204.14.180.0/22",
+ "204.79.135.0/24",
+ "204.79.179.0/24",
+ "204.79.181.0/24",
+ "204.79.188.0/24",
+ "204.79.195.0/24",
+ "204.79.196.0/23",
+ "204.79.252.0/24",
+ "204.152.18.0/23",
+ "204.152.140.0/23",
+ "204.231.192.0/24",
+ "204.231.194.0/23",
+ "204.231.197.0/24",
+ "204.231.198.0/23",
+ "204.231.200.0/21",
+ "204.231.208.0/20",
+ "204.231.236.0/24",
+ "205.174.224.0/20",
+ "206.138.168.0/21",
+ "206.191.224.0/19",
+ "207.46.0.0/16",
+ "207.68.128.0/18",
+ "208.68.136.0/21",
+ "208.76.44.0/22",
+ "208.84.0.0/21",
+ "209.240.192.0/19",
+ "213.199.128.0/18",
+ "216.32.180.0/22",
+ "216.220.208.0/20",
+ "23.96.0.0/13",
+ "42.159.0.0/16",
+ "51.13.0.0/17",
+ "51.107.0.0/16",
+ "51.116.0.0/16",
+ "51.120.0.0/16",
+ "51.120.128.0/17",
+ "51.124.0.0/16",
+ "102.37.0.0/18",
+ "102.133.0.0/16",
+ "199.30.16.0/20",
+ "204.79.180.0/24"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Sql/managedInstances",
+ "apiVersion": "2019-06-01-preview",
+ "name": "[concat('managedInstance-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "GP_Gen5",
+ "tier": "GeneralPurpose"
+ },
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "tags": {
+ "tag1": "value1",
+ "tag2": "value2"
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/BuildMINetworking"
+ ],
+ "properties": {
+ "administratorLogin": "GEN-UNIQUE",
+ "administratorLoginPassword": "GEN-PASSWORD",
+ "subnetId": "Microsoft.Network/virtualNetworks/subnets/virtualNetwork/mi-subnet",
+ "storageSizeInGB": "256",
+ "vCores": "8",
+ "licenseType": "BasePrice",
+ "hardwareFamily": "Gen5",
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "publicDataEndpointEnabled": "false"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT639 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT639
new file mode 100644
index 0000000..1d4faec
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT639
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-all-tabs-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-all-tabs-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898467,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-all-tabs-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-all-tabs-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT639",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT639",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT64 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT64
new file mode 100644
index 0000000..6acc935
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT64
@@ -0,0 +1,114 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/orchestrator-server-setup-trend.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884524,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/orchestrator-server-setup-trend.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT64",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT64",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/configureOrchestrator",
+ "apiVersion": "2015-05-01-preview",
+ "location": "westus",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "https://raw.githubusercontent.com/sysgain/cloudtry-p2p-public-artifacts/master/scripts/TrendMicro/p2porchAllinOneTrend.sh"
+ ],
+ "commandToExecute": "sh p2porchAllinOneTrend.sh"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT640 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT640
new file mode 100644
index 0000000..372a2b4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT640
@@ -0,0 +1,1712 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-all-tabs-report/azuredeploy.json",
+ "/demos/backup-all-tabs-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898478,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-all-tabs-report/azuredeploy.json",
+ "/demos/backup-all-tabs-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT640",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT640",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "AllTabs",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at whch emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "dailyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for daily retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their daily retention point duration, use the value -1."
+ }
+ },
+ "weeklyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for weekly retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their weekly retention point duration, use the value -1."
+ }
+ },
+ "monthlyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for monthly retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their monthly retention point duration, use the value -1."
+ }
+ },
+ "yearlyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for yearly retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their yearly retention point duration, use the value -1."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "All Tabs",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "AllTabs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "All Tabs",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "dailyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ },
+ "monthlyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "weeklyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ },
+ "yearlyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Any_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "All Tabs",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ],
+ "Scope-2": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ],
+ "Scope-3": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Attachments": [
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-OptimizeGrid1'))}",
+ "Name": "InactiveResources.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-OptimizeGrid2'))}",
+ "Name": "RetentionOptimizations.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-OptimizeGrid3'))}",
+ "Name": "BackupScheduleOptimizations.csv"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-BillingGroupTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-BillingGroupTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-BillingGroupTabCloudStorageTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-BillingGroupTabCloudStorageTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-JobOperation')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-JobOperation')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-JobList'))}",
+ "Name": "JobList.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-BillingGroupList'))}",
+ "Name": "BillingGroupList.csv"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-JobFailureCode')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-JobFailureCode')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-JobStatus')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-JobStatus')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-BackupInstanceTabCloudStorageTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-BackupInstanceTabCloudStorageTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-BackupInstanceTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-BackupInstanceTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-BackupInstanceList'))}",
+ "Name": "BackupInstanceList.csv"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-PolicyTabCloudStorageTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-PolicyTabCloudStorageTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-PolicyTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-PolicyTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-PolicyList'))}",
+ "Name": "PoliciesList.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-ByBackupInstance-ItemsBackedupDaily'))}",
+ "Name": "PolicyAdherenceByBackupInstance-ItemsBackedupDaily.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-ByBackupInstance-ItemsBackedupWeekly'))}",
+ "Name": "PolicyAdherenceByBackupInstance-ItemsBackedupWeekly.csv"
+ }
+ ],
+ "Body": "
\nBackup Reports
\n
\nEmail Contents
\n
\n1. Inline
a. Summary - Key Parameters by Backup Solution
b. Backup Instances - Trend of backup instances count over time
c. Backup Instances - Trend of backup cloud storage (GB) consumed over time
d. Billing Groups - Trend of protected instances count over time
e. Billing Groups - Trend of backup cloud storage GMB) consumed over time
f. Jobs - Jobs by Status over time
g. Jobs - Jobs by Operation
h. Jobs - Jobs by Failure Code
i. Policies - Trend of active policy count over time
j. Policies - Trend of cloud storage (GB) consumed over time
k. Policy Adherence - Policy Adherence by Time Period for items backed up daily
l. Policy Adherence - Policy Adherence by Time Period for items backed up weekly
\n
\n2. Attachments
a. Backup Instances - List of all backup instances with details on policy, backup storage consumed, storage replication type etc.
b. Billing Groups - List of all billing groups with details on protected instances, backup storage consumed, storage replication type etc.
c. Jobs - List of all backup and restore jobs triggered in selected time range
d. Policies - List of all backup policies with details on number of associated items, total cloud storage consumed (GB) etc.
e. Inactive Resources - Backup Instances with no recovery point in selected time range.
f. Retention Optimizations - List of all backup instances with retentions greater than specified value.
g. Backup Schedule Optimizations - List of all databases configured for daily full backup.
h. Policy Adherence - Policy Adherence by Backup Instance for items backed up daily.
i. Policy Adherence - Policy Adherence by Backup Instance for items backed up weekly.
Learn more about Backup Reports
Summary
\n
\n@{base64ToString(body('Run_query_and_visualize_results-SummaryGrid')?['body'])}
\n
\nBackupInstance
\n
\n@{variables('BackupInstanceVisual')}
\n
\nBillingGroup
\n
\n@{variables('BillingGroupVisual')}
\n
\nJob
\n
\n@{variables('JobVisual')}
\n
\nPolicy
\n
\n@{variables('PoliciesVisual')}
\n
\nPolicyAdherence
\n
\n@{variables('PolicyAdherenceVisual')}
",
+ "Subject": "All Tabs",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-2')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-2')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-2')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-2')[0]['status']",
+ "TimedOut"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-3')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-3')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-3')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope-3')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-JobEmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceVisual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForLatestData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n// DatasourceSetType\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true) \n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {union (LatestBackupItemAssociationAndStorageConsumptionTable | where (_RangeEnd-_RangeStart == 1d)), (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceTrendFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceTrendFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Trend')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-NoDataMessage": {
+ "inputs": {
+ "variables": [
+ {
+ "name": "NoDataMessage",
+ "type": "array",
+ "value": [
+ {
+ "Message": "No records found"
+ }
+ ]
+ }
+ ]
+ },
+ "runAfter": {
+ "Initialize_variable-BillingGroupEmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable"
+ },
+ "Initialize_variable-BillingGroupEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-PolicyAdherenceEmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BillingGroupVisual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BillingGroupFunction": {
+ "runAfter": {
+ "Initialize_variable-PolicyFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BillingGroupFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _BillingGroupName = \"*\";\n//Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\nlet AzureStorageProtectedInstanceCountCutoffDate = datetime(2/01/2021, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedInstanceUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay;\nProtectedInstanceTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or BackupItemFriendlyName contains (_BillingGroupName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or BackupItemFriendlyName contains (_BillingGroupName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nBase_Size\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nBase_Size\n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\t\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\nBase_Size\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tBase_Size\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nVaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, TimeRangeEndDay = startofday(TimeGenerated)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = () \n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(BI_HistoryCombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nVaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, TimeRangeEndDay\n};\nlet LatestProtectedContainerHistoryInfoTableExcludingDPMVMs = (){\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable \n| where not((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n| summarize StorageConsumedInMBs = sum(StorageConsumedInMBs), BackupItemFrontEndSize = sum(BackupItemFrontEndSize), ProtectedContainerName = any(ProtectedContainerName), ProtectedContainerFriendlyName = any(ProtectedContainerFriendlyName), CustomBackupManagementType = iff((any(BackupManagementType) has \"AzureWorkload\"), any(strcat(BackupManagementType, \"/\", BackupItemType)), any(BackupManagementType)), BackupManagementType = any(BackupManagementType), BackupSolution = any(BackupSolution), VaultUniqueId = any(VaultUniqueId), VaultName = any(VaultName), VaultTags = any(VaultTags), SubscriptionId = any(SubscriptionId), ResourceGroupName = any(ResourceGroupName), AzureDataCenter = any(AzureDataCenter), StorageReplicationType = any(StorageReplicationType), ResourceId = any(ResourceId), TimeGenerated = any(TimeGenerated) by ProtectedContainerUniqueId, TimeRangeEndDay\n};\nlet LatestProtectedContainerInfoTableExcludingDPMVMs = (){\n// projecting TimeRangeDay to distill the report for RangeEndDay\nLatestBackupItemAssociationAndStorageConsumptionTable\n| where not((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n// CustomBackupManagementType needed to distinguish 'AzureWorkload' \n| summarize StorageConsumedInMBs = sum(StorageConsumedInMBs), BackupItemFrontEndSize = sum(BackupItemFrontEndSize), ProtectedContainerName = any(ProtectedContainerName), ProtectedContainerFriendlyName= any(ProtectedContainerFriendlyName), CustomBackupManagementType = iff((any(BackupManagementType) has \"AzureWorkload\"), any(strcat(BackupManagementType, \"/\", BackupItemType)), any(BackupManagementType)),\nBackupManagementType = any(BackupManagementType), BackupSolution = any(BackupSolution), VaultUniqueId = any(VaultUniqueId), VaultName = any(VaultName), VaultTags = any(VaultTags), SubscriptionId = any(SubscriptionId), ResourceGroupName = any(ResourceGroupName), AzureDataCenter = any(AzureDataCenter), StorageReplicationType = any(StorageReplicationType), ResourceId = any(ResourceId), TimeGenerated = any(TimeGenerated), TimeRangeEndDay = startofday(any(TimeGenerated)) by ProtectedContainerUniqueId\n};\nlet TotalProtectedInstanceHistoryTable = (isProtectedContainerBillingType:bool) \n{union isfuzzy = true \n(ProtectedInstanceHistoryUnderAzureDiagnostics(isProtectedContainerBillingType) | where _ExcludeLegacyEvent == false),\n(ProtectedInstanceHistoryUnderResourceSpecific(isProtectedContainerBillingType))\n// ProtectedInstance is at BillingGroup level. CustomBackupManagementType can be the filter used.\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay\n};\nlet LatestProtectedInstanceTable = (isProtectedContainerBillingType:bool) \n{union isfuzzy = true \n(ProtectedInstanceUnderAzureDiagnostics(isProtectedContainerBillingType) | where _ExcludeLegacyEvent == false),\n(ProtectedInstanceUnderResourceSpecific(isProtectedContainerBillingType))\n| where startofday(TimeGenerated) == AsonDay\n// ProtectedInstance is at BillingGroup level. CustomBackupManagementType can be the filter used.\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay = startofday(TimeGenerated)\n};\nlet LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId = ()\n{ \nTotalProtectedInstanceHistoryTable(true) \n| join kind= rightouter (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType = BackupManagementType1, BackupSolution, CustomBackupManagementType, BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, BillingGroupUniqueId = ProtectedContainerUniqueId1, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter,\nStorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceTableFromProtectedContainerUniqueId = ()\n{ \nLatestProtectedInstanceTable(true)\n| join kind= rightouter (LatestProtectedContainerInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType = BackupManagementType1, BackupSolution, CustomBackupManagementType, BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, BillingGroupUniqueId = ProtectedContainerUniqueId1, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter,\nStorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceHistoryTableFromBackupItemUniqueId = ()\n{ \n(TotalProtectedInstanceHistoryTable(false) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\"))\n| join kind= rightouter (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where ((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \n or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n | extend CustomBackupManagementType = BackupManagementType) on BackupItemUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, CustomBackupManagementType, BackupManagementType, BackupSolution, BillingGroupType = \"Datasource\", BillingGroupFriendlyName = BackupItemFriendlyName, BillingGroupUniqueId = BackupItemUniqueId1, BillingGroupName = BackupItemName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceTableFromBackupItemUniqueId = ()\n{ \n(LatestProtectedInstanceTable(false)\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\"))\n| join kind= rightouter \n// applicable only for DPM VM Scenarios\n(LatestBackupItemAssociationAndStorageConsumptionTable | where ((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n| extend CustomBackupManagementType = BackupManagementType) on BackupItemUniqueId\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType, CustomBackupManagementType, BackupSolution, BillingGroupType = \"Datasource\", BillingGroupFriendlyName = BackupItemFriendlyName, \n BillingGroupUniqueId = BackupItemUniqueId1, BillingGroupName = BackupItemName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\n// Special handling for DPM, AzureBackupServer Cluster scenario - Node PS has ProtectedInstance, whereas Cluster PS has storage Consumption\nlet LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId = ()\n{ \n((TotalProtectedInstanceHistoryTable(true) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where ProtectedInstanceCount > 0)\n| join kind= leftanti (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay)\n| join (\nunion isfuzzy = true \n(ProtectedContainerUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ProtectedContainerUnderResourceSpecific())\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId)\n on ProtectedContainerUniqueId\n // BackupItemFrontEndSize and StorageConsumed will be 0.0 as the same will be calculated at cluster level \n // As it is DPM or AzureBackupServer, no extra handling needed for AzureWorkload\n // Ideally the TimeGenerated field should come from BackupItem/ProtectedContainer. This is a special case and we are getting the container properties from latest table and not from history table.\n| project TimeRangeEndDay, TimeGenerated, ProtectedInstanceCount, BackupItemFrontEndSize = 0.0, StorageConsumedInMBs = 0.0, BackupManagementType, CustomBackupManagementType = BackupManagementType, \nBackupSolution = iff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \"DPM\"), BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, \n BillingGroupUniqueId = ProtectedContainerUniqueId, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\n// Special handling for DPM, AzureBackupServer Cluster scenario - Node PS has ProtectedInstance, whereas Cluster PS has storage Consumption\nlet LatestProtectedInstanceTableFromDPMNodeProtectedContainerUniqueId = ()\n{ \n(\n(LatestProtectedInstanceTable(true)\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where ProtectedInstanceCount > 0)\n| join kind= leftanti (LatestProtectedContainerInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId\n| project ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay)\n| join (\nunion isfuzzy = true \n(ProtectedContainerUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ProtectedContainerUnderResourceSpecific())\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId)\n on ProtectedContainerUniqueId\n // BackupItemFrontEndSize and StorageConsumed will be 0.0 as the same will be calculated at cluster level \n // As it is DPM or AzureBackupServer, no extra handling needed for AzureWorkload\n // Ideally the TimeGenerated field should come from BackupItem/ProtectedContainer. This is a special case and we are getting the container properties from latest table and not from history table.\n| project TimeRangeEndDay, TimeGenerated, ProtectedInstanceCount, BackupItemFrontEndSize = 0.0, StorageConsumedInMBs = 0.0, BackupManagementType, CustomBackupManagementType = BackupManagementType,\n BackupSolution = iff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \"DPM\"), BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, \n BillingGroupUniqueId = ProtectedContainerUniqueId, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet ProtectedInstanceHistoryMetric = ( )\n{ union \n(LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId()),\n(LatestProtectedInstanceHistoryTableFromBackupItemUniqueId()),\n(LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| project CustomBackupManagementType, BackupItemFrontEndSize, StorageConsumedInMBs, BillingGroupUniqueId, BillingGroupFriendlyName, BillingGroupName, ProtectedInstanceCount, BillingGroupType, TimeRangeEndDay, TimeGenerated, BackupManagementType, BackupSolution, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet ProtectedInstanceMetric = ( ) \n{ union \n(LatestProtectedInstanceTableFromBackupItemUniqueId() ),\n(LatestProtectedInstanceTableFromProtectedContainerUniqueId()),\n(LatestProtectedInstanceTableFromDPMNodeProtectedContainerUniqueId)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| project CustomBackupManagementType, BackupManagementType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs, ProtectedInstanceCount, BillingGroupUniqueId, BillingGroupFriendlyName, BillingGroupName, BillingGroupType, TimeRangeEndDay, TimeGenerated, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet FinalTable = () {union (ProtectedInstanceMetric | where (_RangeEnd-_RangeStart == 1d)), (ProtectedInstanceHistoryMetric | where (_RangeEnd-_RangeStart > 1d))\n};\n// Display Tweaks for AFS and null ProtectedInstanceCount\n// Billing Entity is at BackupManagementType level and not at DS level. \nlet FinalTable_V1Vault = () {FinalTable\n| project CustomBackupManagementType, BackupManagementType, BackupSolution, ProtectedInstanceCount = iff(isempty(ProtectedInstanceCount), 0.0 ,todouble(ProtectedInstanceCount)/10), StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), todouble(StorageConsumedInMBs)), BackupItemFrontEndSize = iff(isempty(BackupItemFrontEndSize), todouble(0), todouble(BackupItemFrontEndSize)), BillingGroupUniqueId, BillingGroupType, BillingGroupName, BillingGroupFriendlyName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, StorageReplicationType, ProtectedContainerName, TimeGenerated\n| project UniqueId = BillingGroupUniqueId, Name = BillingGroupName, Type = BillingGroupType, FriendlyName = BillingGroupFriendlyName, SourceSizeInMBs = BackupItemFrontEndSize, ExtendedProperties = pack(\"ProtectedInstanceCount\", ProtectedInstanceCount), VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, BackupSolution, VaultUniqueId, VaultName, VaultResourceId = ResourceId, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultTags, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BillingGroupTrendFunction": {
+ "runAfter": {
+ "Initialize_variable-BillingGroupFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BillingGroupTrendFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Trend')}\nlet _BillingGroupName = \"*\";\n//Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\nlet AzureStorageProtectedInstanceCountCutoffDate = datetime(2/01/2021, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated)) \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedInstanceUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay;\nProtectedInstanceTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or BackupItemFriendlyName contains (_BillingGroupName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\t\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\nBase_Size\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tBase_Size\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = () \n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(BI_HistoryCombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nVaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, TimeRangeEndDay\n};\nlet LatestProtectedContainerHistoryInfoTableExcludingDPMVMs = (){\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable \n| where not((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n| summarize StorageConsumedInMBs = sum(StorageConsumedInMBs), BackupItemFrontEndSize = sum(BackupItemFrontEndSize), ProtectedContainerName = any(ProtectedContainerName), ProtectedContainerFriendlyName = any(ProtectedContainerFriendlyName), CustomBackupManagementType = iff((any(BackupManagementType) has \"AzureWorkload\"), any(strcat(BackupManagementType, \"/\", BackupItemType)), any(BackupManagementType)), BackupManagementType = any(BackupManagementType), BackupSolution = any(BackupSolution), VaultUniqueId = any(VaultUniqueId), VaultName = any(VaultName), VaultTags = any(VaultTags), SubscriptionId = any(SubscriptionId), ResourceGroupName = any(ResourceGroupName), AzureDataCenter = any(AzureDataCenter), StorageReplicationType = any(StorageReplicationType), ResourceId = any(ResourceId), TimeGenerated = any(TimeGenerated) by ProtectedContainerUniqueId, TimeRangeEndDay\n};\nlet TotalProtectedInstanceHistoryTable = (isProtectedContainerBillingType:bool) \n{union isfuzzy = true \n(ProtectedInstanceHistoryUnderAzureDiagnostics(isProtectedContainerBillingType) | where _ExcludeLegacyEvent == false),\n(ProtectedInstanceHistoryUnderResourceSpecific(isProtectedContainerBillingType))\n// ProtectedInstance is at BillingGroup level. CustomBackupManagementType can be the filter used.\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay\n};\nlet LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId = ()\n{ \nTotalProtectedInstanceHistoryTable(true) \n| join kind= rightouter (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType = BackupManagementType1, BackupSolution, CustomBackupManagementType, BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, BillingGroupUniqueId = ProtectedContainerUniqueId1, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter,\nStorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceHistoryTableFromBackupItemUniqueId = ()\n{ \n(TotalProtectedInstanceHistoryTable(false) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\"))\n| join kind= rightouter (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where ((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \n or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n | extend CustomBackupManagementType = BackupManagementType) on BackupItemUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, CustomBackupManagementType, BackupManagementType, BackupSolution, BillingGroupType = \"Datasource\", BillingGroupFriendlyName = BackupItemFriendlyName, BillingGroupUniqueId = BackupItemUniqueId1, BillingGroupName = BackupItemName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\n// Special handling for DPM, AzureBackupServer Cluster scenario - Node PS has ProtectedInstance, whereas Cluster PS has storage Consumption\nlet LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId = ()\n{ \n((TotalProtectedInstanceHistoryTable(true) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where ProtectedInstanceCount > 0)\n| join kind= leftanti (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay)\n| join (\nunion isfuzzy = true \n(ProtectedContainerUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ProtectedContainerUnderResourceSpecific())\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId)\n on ProtectedContainerUniqueId\n // BackupItemFrontEndSize and StorageConsumed will be 0.0 as the same will be calculated at cluster level \n // As it is DPM or AzureBackupServer, no extra handling needed for AzureWorkload\n // Ideally the TimeGenerated field should come from BackupItem/ProtectedContainer. This is a special case and we are getting the container properties from latest table and not from history table.\n| project TimeRangeEndDay, TimeGenerated, ProtectedInstanceCount, BackupItemFrontEndSize = 0.0, StorageConsumedInMBs = 0.0, BackupManagementType, CustomBackupManagementType = BackupManagementType, \nBackupSolution = iff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \"DPM\"), BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, \n BillingGroupUniqueId = ProtectedContainerUniqueId, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet ProtectedInstanceHistoryMetric = ( )\n{ union \n(LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId()),\n(LatestProtectedInstanceHistoryTableFromBackupItemUniqueId()),\n(LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| project CustomBackupManagementType, BackupItemFrontEndSize, StorageConsumedInMBs, BillingGroupUniqueId, BillingGroupFriendlyName, BillingGroupName, ProtectedInstanceCount, BillingGroupType, TimeRangeEndDay, TimeGenerated, BackupManagementType, BackupSolution, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet FinalTable = () {ProtectedInstanceHistoryMetric\n};\n// Display Tweaks for AFS and null ProtectedInstanceCount\n// Billing Entity is at BackupManagementType level and not at DS level. \nlet FinalTable_V1Vault = () {FinalTable\n| project CustomBackupManagementType, BackupManagementType, BackupSolution, ProtectedInstanceCount = iff(isempty(ProtectedInstanceCount), 0.0 ,todouble(ProtectedInstanceCount)/10), StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), todouble(StorageConsumedInMBs)), BackupItemFrontEndSize = iff(isempty(BackupItemFrontEndSize), todouble(0), todouble(BackupItemFrontEndSize)), BillingGroupUniqueId, BillingGroupType, BillingGroupName, BillingGroupFriendlyName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, StorageReplicationType, ProtectedContainerName, TimeGenerated\n| project UniqueId = BillingGroupUniqueId, Name = BillingGroupName, Type = BillingGroupType, FriendlyName = BillingGroupFriendlyName, SourceSizeInMBs = BackupItemFrontEndSize, ExtendedProperties = pack(\"ProtectedInstanceCount\", ProtectedInstanceCount), VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, BackupSolution, VaultUniqueId, VaultName, VaultResourceId = ResourceId, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultTags, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-JobEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-PolicyEmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "JobVisual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-JobFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceTrendFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "JobFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n// Report filters\n@{variables('ReportFilter_Trend')}\nlet _ProtectionStateList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _JobOperationList = \"*\";\nlet _JobStatusList = \"*\";\nlet _JobFailureCodeList = \"*\";\nlet _ExcludeLog = true;\n// Other Vars\nlet ExtRangeStart = _RangeStart - 2d;\nlet ExtRangeEnd = _RangeEnd + 2d;\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet JobUnderAzureDiagnostics = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AzureDiagnostics \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"Job\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n// Exclude Log Jobs and InProgress Jobs\n| project JobOperation = columnifexists(\"JobOperation_s\", \"\") , JobOperationSubType = columnifexists(\"JobOperationSubType_s\", \"\"), JobUniqueIdGuid = columnifexists(\"JobUniqueId_g\", \"\") , JobUniqueIdStr = columnifexists(\"JobUniqueId_s\", \"\"),\nProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), AdHocOrScheduledJob = columnifexists(\"AdHocOrScheduledJob_s\",\"\"), RecoveryJobDestination = columnifexists(\"RecoveryJobDestination_s\",\"\"),\nRecoveryJobRPDateTime = todatetime(columnifexists(\"RecoveryJobRPDateTime_s\",\"\")), RecoveryJobRPLocation = columnifexists(\"RecoveryJobRPLocation_s\",\"\"), RecoveryLocationType = columnifexists(\"RecoveryLocationType_s\",\"\"),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\",\"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\",\"\"),\nJobStatus = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode = columnifexists(\"JobFailureCode_s\",\"\"), JobStartDateTime = todatetime(columnifexists(\"JobStartDateTime_s\",\"\")), JobDurationInSecs = todouble(columnifexists(\"JobDurationInSecs_s\", \"\")),\nDataTransferredInMB = todouble(columnifexists(\"DataTransferredInMB_s\",\"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\",\"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog) \n| extend JobUniqueId = iff(JobUniqueIdGuid == \"\", JobUniqueIdStr, JobUniqueIdGuid) \n| project-away JobUniqueIdGuid, JobUniqueIdStr\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId ;\nJobTable\n};\nlet JobUnderResourceSpecific = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AddonAzureBackupJobs \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Job\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog)\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId;\nJobTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet LatestBackupItemWithProtectedContainerTable = () \n{\nTotalBackupItemDimensionTable\n| join (union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics()| where _ExcludeLegacyEvent == false),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId) on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet JobFinalTable = (){\n union isfuzzy = true \n(JobUnderAzureDiagnostics(true)| where _ExcludeLegacyEvent == false),\n(JobUnderResourceSpecific(true))\n| project JobStatus, JobUniqueId, JobOperation, JobFailureCode, JobOperationSubType, JobStartDateTime, DataTransferredInMB, AdHocOrScheduledJob, JobDurationInSecs, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId, ProtectedContainerUniqueId, TimeGenerated \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId\n| where JobOperation in~ (_JobOperationList) or '*' in (_JobOperationList)\n| where JobStatus in~ (_JobStatusList) or '*' in (_JobStatusList)\n| where JobFailureCode in~ (_JobFailureCodeList) or '*' in (_JobFailureCodeList)\n| join kind= inner (LatestBackupItemWithProtectedContainerTable) on BackupItemUniqueId\n| project JobUniqueId, JobOperation, JobStatus, JobFailureCode, JobOperationSubType, JobStartDateTime, JobDurationInSecs, DataTransferredInMB, AdHocOrScheduledJob, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId = BackupItemUniqueId1, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, StorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(JobFinalTable)))\n| project UniqueId = JobUniqueId, OperationCategory = JobOperation, Operation = JobOperationSubType, Status = JobStatus, ErrorTitle = JobFailureCode, StartTime = JobStartDateTime, DurationInSecs = JobDurationInSecs, DataTransferredInMBs = DataTransferredInMB, RestoreJobRPDateTime = RecoveryJobRPDateTime, RestoreJobRPLocation = RecoveryJobRPLocation, BackupInstanceUniqueId = BackupItemUniqueId, BackupInstanceId, BackupInstanceFriendlyName = BackupItemFriendlyName, DatasourceResourceId, DatasourceFriendlyName = BackupItemFriendlyName, DatasourceType, BackupSolution, DatasourceSetResourceId, DatasourceSetType, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-PolicyAdherenceEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceEmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "PolicyAdherenceVisual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-PolicyEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-BillingGroupTrendFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "PoliciesVisual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-PolicyFunction": {
+ "runAfter": {
+ "Initialize_variable-JobFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "PolicyFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')} \n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet PolicyWithExtendedPropsUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), PolicyTimeZone = columnifexists(\"PolicyTimeZone_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), DiffBackupFormat = columnifexists(\"DiffBackupFormat_s\", \"\"),\nDiffBackupDaysofTheWeek = columnifexists(\"DiffBackupDaysofTheWeek_s\", \"\"), DiffBackupRetentionDuration = toint(columnifexists(\"DiffBackupRetentionDuration_s\", \"\")), DiffBackupTime = columnifexists(\"DiffBackupTime_s\", \"\"), LogBackupFrequency = toint(columnifexists(\"LogBackupFrequency_s\", \"\")), LogBackupRetentionDuration = toint(columnifexists(\"LogBackupRetentionDuration_s\", \"\")),\nBackupFrequency = columnifexists(\"BackupFrequency_s\", \"\"), BackupTimes = columnifexists(\"BackupTimes_s\", \"\"), BackupDaysOfTheWeek = columnifexists(\"BackupDaysOfTheWeek_s\", \"\"), RetentionType = columnifexists(\"RetentionType_s\", \"\"), RetentionDuration = toint(columnifexists(\"RetentionDuration_s\", \"\")),\nDailyRetentionDuration = toint(columnifexists(\"DailyRetentionDuration_s\", \"\")), DailyRetentionTimes = columnifexists(\"DailyRetentionTimes_s\", \"\"), \nWeeklyRetentionDuration = toint(columnifexists(\"WeeklyRetentionDuration_s\", \"\")), WeeklyRetentionTimes = columnifexists(\"WeeklyRetentionTimes_s\", \"\"), WeeklyRetentionDaysOfTheWeek = columnifexists(\"WeeklyRetentionDaysOfTheWeek_s\", \"\"),\nMonthlyRetentionDuration = toint(columnifexists(\"MonthlyRetentionDuration_s\", \"\")), MonthlyRetentionTimes = columnifexists(\"MonthlyRetentionTimes_s\", \"\"), MonthlyRetentionFormat = columnifexists(\"MonthlyRetentionFormat_s\", \"\"), MonthlyRetentionDaysOfTheMonth = columnifexists(\"MonthlyRetentionDaysOfTheMonth_s\", \"\"), MonthlyRetentionDaysOfTheWeek = columnifexists(\"MonthlyRetentionDaysOfTheWeek_s\", \"\"), MonthlyRetentionWeeksOfTheMonth = columnifexists(\"MonthlyRetentionWeeksOfTheMonth_s\", \"\"),\nYearlyRetentionDuration = toint(columnifexists(\"YearlyRetentionDuration_s\", \"\")), YearlyRetentionTimes = columnifexists(\"YearlyRetentionTimes_s\", \"\"), YearlyRetentionMonthsOfTheYear = columnifexists(\"YearlyRetentionMonthsOfTheYear_s\", \"\"), YearlyRetentionFormat = columnifexists(\"YearlyRetentionFormat_s\", \"\"), YearlyRetentionDaysOfTheMonth = columnifexists(\"YearlyRetentionDaysOfTheMonth_s\", \"\"), YearlyRetentionDaysOfTheWeek = columnifexists(\"YearlyRetentionDaysOfTheWeek_s\", \"\"), YearlyRetentionWeeksOfTheMonth = columnifexists(\"YearlyRetentionWeeksOfTheMonth_s\", \"\"), ResourceId, TimeGenerated\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), ResourceId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated;\n PolicyTable \n};\nlet PolicyWithExtendedPropsUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where OperationName == \"Policy\" \n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated;\n PolicyTable \n};\nlet PolicyHistoryWithExtendedPropsUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), PolicyTimeZone = columnifexists(\"PolicyTimeZone_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), DiffBackupFormat = columnifexists(\"DiffBackupFormat_s\", \"\"),\nDiffBackupDaysofTheWeek = columnifexists(\"DiffBackupDaysofTheWeek_s\", \"\"), DiffBackupRetentionDuration = toint(columnifexists(\"DiffBackupRetentionDuration_s\", \"\")), DiffBackupTime = columnifexists(\"DiffBackupTime_s\", \"\"), LogBackupFrequency = toint(columnifexists(\"LogBackupFrequency_s\", \"\")), LogBackupRetentionDuration = toint(columnifexists(\"LogBackupRetentionDuration_s\", \"\")),\nBackupFrequency = columnifexists(\"BackupFrequency_s\", \"\"), BackupTimes = columnifexists(\"BackupTimes_s\", \"\"), BackupDaysOfTheWeek = columnifexists(\"BackupDaysOfTheWeek_s\", \"\"), RetentionType = columnifexists(\"RetentionType_s\", \"\"), RetentionDuration = toint(columnifexists(\"RetentionDuration_s\", \"\")),\nDailyRetentionDuration = toint(columnifexists(\"DailyRetentionDuration_s\", \"\")), DailyRetentionTimes = columnifexists(\"DailyRetentionTimes_s\", \"\"), \nWeeklyRetentionDuration = toint(columnifexists(\"WeeklyRetentionDuration_s\", \"\")), WeeklyRetentionTimes = columnifexists(\"WeeklyRetentionTimes_s\", \"\"), WeeklyRetentionDaysOfTheWeek = columnifexists(\"WeeklyRetentionDaysOfTheWeek_s\", \"\"),\nMonthlyRetentionDuration = toint(columnifexists(\"MonthlyRetentionDuration_s\", \"\")), MonthlyRetentionTimes = columnifexists(\"MonthlyRetentionTimes_s\", \"\"), MonthlyRetentionFormat = columnifexists(\"MonthlyRetentionFormat_s\", \"\"), MonthlyRetentionDaysOfTheMonth = columnifexists(\"MonthlyRetentionDaysOfTheMonth_s\", \"\"), MonthlyRetentionDaysOfTheWeek = columnifexists(\"MonthlyRetentionDaysOfTheWeek_s\", \"\"), MonthlyRetentionWeeksOfTheMonth = columnifexists(\"MonthlyRetentionWeeksOfTheMonth_s\", \"\"),\nYearlyRetentionDuration = toint(columnifexists(\"YearlyRetentionDuration_s\", \"\")), YearlyRetentionTimes = columnifexists(\"YearlyRetentionTimes_s\", \"\"), YearlyRetentionMonthsOfTheYear = columnifexists(\"YearlyRetentionMonthsOfTheYear_s\", \"\"), YearlyRetentionFormat = columnifexists(\"YearlyRetentionFormat_s\", \"\"), YearlyRetentionDaysOfTheMonth = columnifexists(\"YearlyRetentionDaysOfTheMonth_s\", \"\"), YearlyRetentionDaysOfTheWeek = columnifexists(\"YearlyRetentionDaysOfTheWeek_s\", \"\"), YearlyRetentionWeeksOfTheMonth = columnifexists(\"YearlyRetentionWeeksOfTheMonth_s\", \"\"), ResourceId, TimeGenerated\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), ResourceId, TimeRangeEndDay = startofday(TimeGenerated)\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\nPolicyTable\n};\nlet PolicyHistoryWithExtendedPropsUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId, TimeRangeEndDay = startofday(TimeGenerated)\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n PolicyTable \n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\n// Business Logic\nlet ActivePolicyUnderAzureDiagnostics = ()\n{\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderAzureDiagnostics() | join kind = inner\n\t(BackupItemAssociationUnderAzureDiagnostics() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter\n\t| join kind= inner (\n\t PolicyWithExtendedPropsUnderAzureDiagnostics ) on ResourceId, PolicyUniqueId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated;\n\t};\nBIA_Policy\n};\nlet ActivePolicyUnderResourceSpecific = ()\n{\t\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderResourceSpecific() | join kind = inner\n\t(BackupItemAssociationUnderResourceSpecific() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter\n\t| join kind= inner (\n\t PolicyWithExtendedPropsUnderResourceSpecific ) on ResourceId, PolicyUniqueId\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated;\n\t};\nBIA_Policy\n};\nlet ActivePolicyHistoryUnderAzureDiagnostics = ()\n{\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderAzureDiagnostics() | join kind = inner\n\t(BackupItemAssociationHistoryUnderAzureDiagnostics() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeRangeEndDay\t\n\t| join kind= inner (\n\t PolicyHistoryWithExtendedPropsUnderAzureDiagnostics ) on ResourceId, PolicyUniqueId, TimeRangeEndDay\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n\t};\nBIA_Policy\n};\nlet ActivePolicyHistoryUnderResourceSpecific = ()\n{\t\t\n\tlet BIA_Policy = ()\n\t{\t\n\tBackupItemUnderResourceSpecific() | join kind = inner\n\t(BackupItemAssociationHistoryUnderResourceSpecific() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeRangeEndDay\n\t| join kind= inner (\n\t PolicyHistoryWithExtendedPropsUnderResourceSpecific ) on ResourceId, PolicyUniqueId, TimeRangeEndDay\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n\t};\nBIA_Policy\n};\nlet PolicyExtended_LatestTable = () {\nunion\n(ActivePolicyUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ActivePolicyUnderResourceSpecific())\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId};\nlet PolicyExtended_HistoryTable = () {\nunion\n(ActivePolicyHistoryUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ActivePolicyHistoryUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId, TimeRangeEndDay};\nlet FinalTable_V1Vault = () {union (PolicyExtended_LatestTable | where (_RangeEnd-_RangeStart == 1d)), (PolicyExtended_HistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project UniqueId = PolicyUniqueId, Name = PolicyName, TimeZone = PolicyTimeZone, Id = strcat(ResourceId, \"/backupPolicies/\", PolicyName), \nBackupFrequency = iff(isnotempty(BackupFrequency), pack(\"BackupFrequency\", BackupFrequency), dynamic(null)),\nDiffBackupFormat = iff(isnotempty(DiffBackupFormat), pack(\"DiffBackupFormat\", DiffBackupFormat), dynamic(null)),\nLogBackupFrequency = iff(isnotempty(LogBackupFrequency), pack(\"LogBackupFrequency\", LogBackupFrequency), dynamic(null)),\nDailyRetentionDuration = iff(isnotempty(DailyRetentionDuration), pack(\"DailyRetentionDuration\", DailyRetentionDuration), dynamic(null)),\nWeeklyRetentionDuration = iff(isnotempty(WeeklyRetentionDuration), pack(\"WeeklyRetentionDuration\", WeeklyRetentionDuration), dynamic(null)),\nMonthlyRetentionDuration = iff(isnotempty(MonthlyRetentionDuration), pack(\"MonthlyRetentionDuration\", MonthlyRetentionDuration), dynamic(null)),\nYearlyRetentionDuration = iff(isnotempty(YearlyRetentionDuration), pack(\"YearlyRetentionDuration\", YearlyRetentionDuration), dynamic(null)),\nDiffBackupRetentionDuration = iff(isnotempty(DiffBackupRetentionDuration), pack(\"DiffBackupRetentionDuration\", DiffBackupRetentionDuration), dynamic(null)),\nLogBackupRetentionDuration = iff(isnotempty(LogBackupRetentionDuration), pack(\"LogBackupRetentionDuration\", LogBackupRetentionDuration), dynamic(null)),\nBackupSolution, TimeGenerated, VaultUniqueId, VaultResourceId = ResourceId, VaultName, VaultTags, VaultLocation = AzureDataCenter, VaultSubscriptionId = SubscriptionId, VaultStore_StorageReplicationType = StorageReplicationType,VaultType = \"Microsoft.Recoveryservices/vaults\"\n| project UniqueId, Name, TimeZone, Id, BackupSolution, TimeGenerated, VaultUniqueId, VaultResourceId, VaultName, VaultTags, VaultLocation, VaultSubscriptionId, VaultStore_StorageReplicationType, VaultType, ExtendedProperties = bag_merge(BackupFrequency, DiffBackupFormat, LogBackupFrequency, DailyRetentionDuration, WeeklyRetentionDuration, MonthlyRetentionDuration, YearlyRetentionDuration, DiffBackupRetentionDuration, LogBackupRetentionDuration)\n};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForLatestData": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Latest",
+ "type": "string",
+ "value": "let _RangeStart = iff(( datetime(@{parameters('endDate')})== datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('endDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Scope": {
+ "actions": {
+ "Create_CSV_table-BackupInstanceList": {
+ "runAfter": {
+ "Run_query_and_list_results-BackupInstanceList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-BackupInstanceList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-BackupInstanceList')?['value'])"
+ }
+ },
+ "Create_CSV_table-JobList": {
+ "runAfter": {
+ "Run_query_and_list_results-JobList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-JobList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-JobList')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-BackupInstanceList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-BackupInstanceTabCloudStorageTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceFunction')}\n| project Id, BackupInstance=FriendlyName, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=PolicyName, CloudStorage=VaultStore_StorageConsumptionInMBs/1024, Vault=VaultResourceId, StorageReplicationType=VaultStore_StorageReplicationType, AzureResource=DatasourceSetResourceId, DatasourceType",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-JobList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-JobStatus": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n| project BackupInstance=BackupInstanceFriendlyName, BackupInstanceId, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), OperationCategory, JobStatus=Status, JobStartDateTime=StartTime, JobDuration=DurationInSecs/3600, ErrorTitle, DataTransferred=DataTransferredInMBs, AzureResource=DatasourceSetResourceId, DatasourceType ",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-BackupInstanceTabCloudStorageTrend": {
+ "runAfter": {
+ "Run_query_and_visualize_results-BackupInstanceTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| summarize StorageConsumedInGBs = sum(VaultStore_StorageConsumptionInMBs)/(1024) by TimeRangeEndDay = startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-BackupInstanceTrend": {
+ "runAfter": {
+ "Set_variable-JobEmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| summarize BackupItemCount = count(UniqueId) by startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-JobFailureCode": {
+ "runAfter": {
+ "Run_query_and_visualize_results-JobOperation": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n// query to transform function output\n| where Status == \"Failed\"\n| summarize JobFailureCode = any(ErrorTitle), JobOperation = any(OperationCategory) by UniqueId\n| summarize count(JobOperation) by JobFailureCode\n| sort by count_JobOperation",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Pie Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-JobOperation": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n// query to transform function output\n| summarize Status = any(Status), Operation = any(OperationCategory) by UniqueId\n| summarize count(Status) by Operation\n| sort by Operation",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Bar Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-JobStatus": {
+ "runAfter": {
+ "Run_query_and_visualize_results-JobFailureCode": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n// query to transform function output\n| summarize arg_max(TimeGenerated, Status) by UniqueId\n| summarize count(Status) by Status, bin(TimeGenerated, 1d)\n| project TimeGenerated, count_Status, JobStatus = ( iff(Status == \"Completed\", \"Succeeded\", iff(Status == \"CompletedWithWarnings\", \"SucceededWithWarnings\", Status)))\n| sort by TimeGenerated asc",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Bar Chart"
+ }
+ }
+ },
+ "Set_variable-BackupInstanceEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-BackupInstanceList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "BackupInstanceVisual",
+ "value": "\n
Backup Instances Trend
\n
\n
?['attachmentName']}\")
\n
\n
Cloud Storage Trend
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ },
+ "Set_variable-JobEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-JobList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "JobVisual",
+ "value": "\n
Jobs by Status
\n
\n
?['attachmentName']}\")
\n
\n
Jobs by JobOperation
\n
\n
?['attachmentName']}\")
\n
\n
Jobs by Failure Code
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ },
+ "Scope-2": {
+ "actions": {
+ "Create_CSV_table-BillingGroupList": {
+ "runAfter": {
+ "Run_query_and_list_results-BillingGroupList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-BillingGroupList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-BillingGroupList')?['value'])"
+ }
+ },
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupDaily": {
+ "runAfter": {
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily')?['value'])"
+ }
+ },
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupWeekly": {
+ "runAfter": {
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupDaily": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-BillingGroupList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-BillingGroupTabCloudStorageTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BillingGroupFunction')}\n| extend name_array = split(Name,\";\")\n| extend name_arraylen = array_length(name_array)\n| project BilledEntity=FriendlyName, BilledEntityResourceGroup=iff(name_arraylen == 3, name_array[(name_arraylen-2)], \"(none)\"), BilledEntityType=Type, BackupSolution, ProtectedInstances=todouble(parse_json(ExtendedProperties).ProtectedInstanceCount), CloudStorage=VaultStore_StorageConsumptionInMBs/1024, StorageReplicationType=VaultStore_StorageReplicationType, Vault=VaultResourceId, VaultResourceGroup=split(split(tolower(VaultResourceId), '/resourcegroups/')[1],'/')[0], Subscription=VaultSubscriptionId",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily": {
+ "runAfter": {
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupWeekly": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\n// Grid specific params\nlet bin_Value = iff(aggregationTypeParam == \"Weekly\", 7d, iff(aggregationTypeParam == \"Monthly\", 28d, 1d));\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Weekly\", \"7\", iff(aggregationTypeParam == \"Monthly\", \"28\", \"1\")); \nlet duration_Value = iff(aggregationTypeParam == \"Weekly\", \"6.00:00:00\", iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"00.00:00:00\")); \nlet BackupInstanceWithDailyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\n// calling LA System Function\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Daily\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithDailyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount = count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId=any(BackupInstanceId), BackupSolution = any(BackupSolution), DatasourceSetResourceId = any(DatasourceSetResourceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName) by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n| project ResourceGroup=iff(BackupSolution ==\"Azure Backup Agent\" or BackupSolution ==\"Azure Backup Server\" or BackupSolution ==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]), jobCount, jobSuccessCount, BackupInstanceFriendlyName, BackupInstanceUniqueId, DatasourceSetFriendlyName, JobCreationDate, BackupInstanceId\n};\nJobInfo\n| summarize by BackupInstanceUniqueId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, BackupInstanceId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, BackupInstanceFriendlyName, BackupInstanceId, DatasourceSetFriendlyName, ResourceGroup, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n| sort by BackupInstanceUniqueId, Day desc\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Day, jobTotalCountInTheTimePeriod = iff(isnull(jobCount), 0, jobCount), isJobSuccessInTheTimePeriod =iff(isnull(jobCount), 0, iff((jobSuccessCount > 1), 1, jobSuccessCount))\n| summarize max(Day), min(Day), sum(isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName),BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, bin_at(Day, bin_Value, RangeEnd + 1d)\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Period = iff(aggregationTypeParam == \"Weekly\" or aggregationTypeParam == \"Monthly\", strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), format_datetime(todatetime(min_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize sum_isJobSuccessInTheTimePeriod = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, Period\n| evaluate pivot(Period, any(sum_isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName, BackupInstanceId, BackupInstanceUniqueId, DatasourceSetFriendlyName, ResourceGroup)\n| sort by BackupInstanceUniqueId asc",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "WonderDemoMonitoringRG",
+ "resourcename": "WonderDemoMonitoring",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "ef4ab5a7-c2c0-4304-af80-af49f48af3d1",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly": {
+ "runAfter": {
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\n// Grid specific params\nlet bin_Value = iff(aggregationTypeParam == \"Monthly\", 28d, 7d);\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Monthly\", \"4\", \"1\"); \nlet duration_Value = iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"6.00:00:00\"); \nlet BackupInstanceWithWeeklyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Weekly\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithWeeklyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount = count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), BackupSolution = any(BackupSolution), DatasourceSetResourceId = any(DatasourceSetResourceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName) by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n| project ResourceGroup=iff(BackupSolution ==\"Azure Backup Agent\" or BackupSolution ==\"Azure Backup Server\" or BackupSolution ==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]), jobCount, jobSuccessCount, BackupInstanceFriendlyName, BackupInstanceUniqueId, DatasourceSetFriendlyName, JobCreationDate, BackupInstanceId\n};\nJobInfo\n| summarize by BackupInstanceUniqueId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, BackupInstanceId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n| sort by BackupInstanceUniqueId, Day desc\n// Create weekly buckets to check if SLA met\n| summarize max(Day), min(Day), sum(jobSuccessCount), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName),BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, bin_at(Day, 7d, RangeEnd + 1d)\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Day, sum_isJobSuccessInTheTimePeriod = iff(sum_jobSuccessCount > 1, 1, sum_jobSuccessCount), max_Day, min_Day\n| summarize max_Day = max(max_Day), min_Day = min(min_Day), sum_isJobSuccessInTheTimePeriod = sum(sum_isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, Day = bin_at(Day, bin_Value, RangeEnd + 1d)\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Period = strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize sum_isJobSuccessInTheTimePeriod = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, Period\n| evaluate pivot(Period, any(sum_isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName, BackupInstanceId, BackupInstanceUniqueId, DatasourceSetFriendlyName, ResourceGroup)\n| sort by BackupInstanceUniqueId asc",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "WonderDemoMonitoringRG",
+ "resourcename": "WonderDemoMonitoring",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "ef4ab5a7-c2c0-4304-af80-af49f48af3d1",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-BillingGroupTabCloudStorageTrend": {
+ "runAfter": {
+ "Run_query_and_visualize_results-BillingGroupTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BillingGroupTrendFunction')}\n// query to transform function output\n| summarize StorageConsumedInGBs = sum(VaultStore_StorageConsumptionInMBs)/1024 by startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-BillingGroupTrend": {
+ "runAfter": {
+ "Run_query_and_visualize_results-SummaryGrid": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BillingGroupTrendFunction')}\n// query to transform function output\n| summarize ProtectedInstanceCount = sum(todouble(parse_json(ExtendedProperties).ProtectedInstanceCount)) by startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupDaily": {
+ "runAfter": {
+ "Set_variable-BillingGroupEmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\n// Grid specific params\nlet bin_Value = iff(aggregationTypeParam == \"Weekly\", 7d, iff(aggregationTypeParam == \"Monthly\", 28d, 1d));\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Weekly\", \"7\", iff(aggregationTypeParam == \"Monthly\", \"28\", \"1\")); \nlet duration_Value = iff(aggregationTypeParam == \"Weekly\", \"6.00:00:00\", iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"00.00:00:00\")); \nlet BackupInstanceWithDailyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Daily\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\n// calling LA System Function\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithDailyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount =count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), jobFailureCount = countif(Status == \"Failed\" or Status == \"Cancelled\") by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n};\nJobInfo\n| summarize by BackupInstanceUniqueId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n// calculating isJobSuccess in the timeperiod to determine if it is successfull throughout the timeperiod\n| project BackupInstanceUniqueId, Day, isJobSuccessInTheTimePeriod =iff(isnull(jobCount), 0, iff((jobSuccessCount > 1), 1, jobSuccessCount)), jobFailureCount\n| summarize max(Day), min(Day), sum(isJobSuccessInTheTimePeriod), sum(jobFailureCount) by BackupInstanceUniqueId, bin_at(Day, bin_Value, RangeEnd + 1d)\n//| where BackupInstanceUniqueId in (\"westus;1541146419693764636;iaasvmcontainerv2;arult-test;cvarshrbac\",\"southeastasia;7777938885731870052;iaasvmcontainerv2;trinadhkselfhostrg;databasevm8\")\n| project BackupInstanceUniqueId, Period = iff(aggregationTypeParam == \"Weekly\" or aggregationTypeParam == \"Monthly\", strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), format_datetime(todatetime(min_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, sum_jobFailureCount, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize ItemsWithSuccessfulDailyBackup = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), ItemsWithoutSuccessfulDailyBackup = countif(sum_isJobSuccessInTheTimePeriod != sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), sum_jobFailureCount = any(sum_jobFailureCount) by BackupInstanceUniqueId, Period\n| summarize ItemsWithSuccessfulDailyBackup = sum(ItemsWithSuccessfulDailyBackup), ItemsWithoutSuccessfulDailyBackup = sum(ItemsWithoutSuccessfulDailyBackup), FailedBackupJobs = sum(sum_jobFailureCount), RangeStartValue = (any(Day)) by Period\n| sort by RangeStartValue desc | project-away RangeStartValue",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "WonderDemoMonitoringRG",
+ "resourcename": "WonderDemoMonitoring",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "ef4ab5a7-c2c0-4304-af80-af49f48af3d1",
+ "timerange": "Set in query",
+ "visType": "Html Table"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupWeekly": {
+ "runAfter": {
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupDaily": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\nlet bin_Value = iff(aggregationTypeParam == \"Monthly\", 28d, 7d);\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Monthly\", \"4\", \"1\"); \nlet duration_Value = iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"6.00:00:00\"); \nlet BackupInstanceWithWeeklyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Weekly\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithWeeklyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount =count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), jobFailureCount = countif(Status == \"Failed\" or Status == \"Cancelled\") by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n};\nJobInfo\n| summarize by BackupInstanceUniqueId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n// Create weekly buckets to check if SLA met\n| summarize max(Day), min(Day), sum(jobSuccessCount), sum(jobFailureCount) by BackupInstanceUniqueId, bin_at(Day, 7d, RangeEnd + 1d)\n| project BackupInstanceUniqueId, Day, sum_isJobSuccessInTheTimePeriod = iff(sum_jobSuccessCount > 1, 1, sum_jobSuccessCount), sum_jobFailureCount, max_Day, min_Day\n| summarize max_Day = max(max_Day), min_Day = min(min_Day), sum_isJobSuccessInTheTimePeriod = sum(sum_isJobSuccessInTheTimePeriod), sum_jobFailureCount = sum(sum_jobFailureCount) by BackupInstanceUniqueId, Day = bin_at(Day, bin_Value, RangeEnd + 1d)\n| project BackupInstanceUniqueId, Period = strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, sum_jobFailureCount, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize ItemsWithSuccessfulWeeklyBackup = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), ItemsWithoutSuccessfulWeeklyBackup = countif(sum_isJobSuccessInTheTimePeriod != sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), sum_jobFailureCount = any(sum_jobFailureCount) by BackupInstanceUniqueId, Period\n| summarize ItemsWithSuccessfulWeeklyBackup = sum(ItemsWithSuccessfulWeeklyBackup), ItemsWithoutSuccessfulWeeklyBackup = sum(ItemsWithoutSuccessfulWeeklyBackup), FailedBackupJobs = sum(sum_jobFailureCount), RangeStartValue = (any(Day)) by Period\n| sort by RangeStartValue desc | project-away RangeStartValue\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "WonderDemoMonitoringRG",
+ "resourcename": "WonderDemoMonitoring",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "ef4ab5a7-c2c0-4304-af80-af49f48af3d1",
+ "timerange": "Set in query",
+ "visType": "Html Table"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-SummaryGrid": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let BackupInstanceDetails = (){\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n// query to transform function output\n| summarize BackupInstances=count(UniqueId), CloudStorage=sum(VaultStore_StorageConsumptionInMBs)/(1024) by BackupSolution\n};\nlet JobSuccessPercentageTable = (){\n// calling LA System Function\n@{variables('JobFunction')}\n// query to transform function output\n| extend success=iff((Status == \"Completed\" or Status == \"CompletedWithWarnings\") , 1 , 0)\n| extend record = iff(UniqueId != \"\", 1, 0) // to be used for total row count\n| summarize SuccessfulCount =sum(success), TotalCount=sum(record) by BackupSolution\n| extend JobSuccessPercentage = (SuccessfulCount*100)/todouble(TotalCount)\n| project-away SuccessfulCount, TotalCount\n};\nBackupInstanceDetails | join kind = leftouter (JobSuccessPercentageTable) on BackupSolution | project-away BackupSolution1 | project BackupSolution, BackupInstances, JobSuccessPercentage=iff( (isnan( JobSuccessPercentage) or isinf( JobSuccessPercentage) or isempty( JobSuccessPercentage)), \"-\", strcat(tostring(round( JobSuccessPercentage,2)), \" %\")), CloudStorage",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Html Table"
+ }
+ }
+ },
+ "Set_variable-BillingGroupEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-BillingGroupList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "BillingGroupVisual",
+ "value": "\n
Protected Instances Trend
\n
\n
?['attachmentName']}\")
\n
\n
Cloud Storage Trend
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ },
+ "Set_variable-PolicyAdherenceEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupWeekly": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "PolicyAdherenceVisual",
+ "value": "\n
PolicyAdherenceByTimePeriod-ItemsBackedupDaily
\n@{base64ToString(body('Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupDaily')?['body'])}\n PolicyAdherenceByTimePeriod-ItemsBackedupWeekly
\n@{base64ToString(body('Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupWeekly')?['body'])}\n"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ },
+ "Scope-3": {
+ "actions": {
+ "Create_CSV_table-OptimizeGrid1": {
+ "runAfter": {
+ "Run_query_and_list_results-OptimizeGrid3": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-OptimizeGrid1')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-OptimizeGrid1')?['value'])"
+ }
+ },
+ "Create_CSV_table-OptimizeGrid2": {
+ "runAfter": {
+ "Create_CSV_table-OptimizeGrid1": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-OptimizeGrid2')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-OptimizeGrid2')?['value'])"
+ }
+ },
+ "Create_CSV_table-OptimizeGrid3": {
+ "runAfter": {
+ "Create_CSV_table-OptimizeGrid2": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-OptimizeGrid3')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-OptimizeGrid3')?['value'])"
+ }
+ },
+ "Create_CSV_table-PolicyList": {
+ "runAfter": {
+ "Run_query_and_list_results-PolicyList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-PolicyList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-PolicyList')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-OptimizeGrid1": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = datetime(@{parameters('startDate')});\nlet RangeEnd = datetime(@{parameters('endDate')});\nlet BackupInstanceFunctionRedirect = (){\n@{variables('BackupInstanceFunction')}\n};\nlet BackupItemWithoutSuccessfulBackup = (){\n// calling LA System Function\n@{variables('JobFunction')}\n| where OperationCategory has \"Backup\"\n| where Status in (\"Completed\",\"CompletedWithWarnings\")\n| join kind= rightanti (\n// calling LA System Function\nBackupInstanceFunctionRedirect\n) on $left.BackupInstanceUniqueId == $right.UniqueId\n| project UniqueId, BackupInstanceFriendlyName = FriendlyName, DatasourceType, ProtectionInfo, VaultResourceId\n};\nlet BackupItemWithoutSuccessfulBackupAndItsRecoveryPointTable = ()\n{\nBackupItemWithoutSuccessfulBackup | join \n(\n// calling LA System Function\nBackupInstanceFunctionRedirect\n) on UniqueId\n| where not(LatestRecoveryPoint >= RangeStart and LatestRecoveryPoint <= RangeEnd)\n};\nBackupItemWithoutSuccessfulBackupAndItsRecoveryPointTable\n| sort by UniqueId asc \n| project BackupInstance=BackupInstanceFriendlyName, Id, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=PolicyName, LatestRecoveryPoint, Vault=VaultResourceId, AzureResource=DatasourceSetResourceId, DatasourceType",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-OptimizeGrid2": {
+ "runAfter": {
+ "Run_query_and_list_results-OptimizeGrid1": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let DailyRetentionParam = @{parameters('dailyRetentionParam')};\nlet WeeklyRetentionParam = @{parameters('weeklyRetentionParam')};\nlet MonthlyRetentionParam = @{parameters('monthlyRetentionParam')};\nlet YearlyRetentionParam = @{parameters('yearlyRetentionParam')};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n| extend ExtendedPropertiesJson = parse_json(ExtendedProperties)\n};\nlet BackupInstanceFunctionRedirect = ()\n{\n@{variables('BackupInstanceFunction')}\n};\nlet OutputTable = () {union isfuzzy = true \n// calling LA System Function\nBackupInstanceFunctionRedirect\n| join kind = leftouter (\n// calling LA System Function\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n};\nOutputTable\n// query to transform function output\n| extend DailyRPRetentionDuration = ExtendedPropertiesJson.DailyRetentionDuration, WeeklyRPRetentionDuration = ExtendedPropertiesJson.WeeklyRetentionDuration, MonthlyRPRetentionDuration = ExtendedPropertiesJson.MonthlyRetentionDuration, YearlyRPRetentionDuration = ExtendedPropertiesJson.YearlyRetentionDuration\n| where (DailyRPRetentionDuration > DailyRetentionParam) and (WeeklyRPRetentionDuration > WeeklyRetentionParam) and (MonthlyRPRetentionDuration > MonthlyRetentionParam) and (YearlyRPRetentionDuration > YearlyRetentionParam)\n| project Id, BackupInstance=FriendlyName, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=Name, DailyRPRetentionDuration, WeeklyRPRetentionDuration, MonthlyRPRetentionDuration, YearlyRPRetentionDuration, Vault=VaultResourceId, AzureResource=DatasourceSetResourceId, DatasourceType\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-OptimizeGrid3": {
+ "runAfter": {
+ "Run_query_and_list_results-OptimizeGrid2": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet LatestAzureWorkloadBackupItemDimensionTable = () {union isfuzzy = true \n// calling LA System Function\nBackupInstanceRedirect\n| where BackupSolution in~ (\"SQL in Azure VM Backup\",\"SAP HANA in Azure VM Backup\") \n| join kind = leftouter (\n// calling LA System Function\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Daily\"\n};\nLatestAzureWorkloadBackupItemDimensionTable\n| sort by UniqueId asc \n| project Id, BackupInstance=FriendlyName, Container=DatasourceSetFriendlyName, ResourceGroup=iff(BackupSolution==\"Azure Backup Agent\" or BackupSolution==\"Azure Backup Server\" or BackupSolution==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=Name, Vault=VaultResourceId, AzureResource=DatasourceSetResourceId, DatasourceType",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-PolicyList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-PolicyTabCloudStorageTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceFunction')}\n// query to transform function output\n| where PolicyUniqueId != \"\"\n| summarize sum(SourceSizeInMBs), sum(VaultStore_StorageConsumptionInMBs), count(UniqueId), StorageReplicationType = any(VaultStore_StorageReplicationType), PolicyName = any(PolicyName), Vault = any(VaultResourceId), PolicyId = any(PolicyId) by PolicyUniqueId, VaultResourceId\n| project PolicyId, PolicyName, BackupInstances=count_UniqueId, CloudStorage = sum_VaultStore_StorageConsumptionInMBs/1024, Vault, StorageReplicationType, VaultAndPolicyUniqueId = strcat(Vault,PolicyUniqueId)",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-PolicyTabCloudStorageTrend": {
+ "runAfter": {
+ "Run_query_and_visualize_results-PolicyTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| summarize StorageConsumedInGBs = sum(VaultStore_StorageConsumptionInMBs)/(1024) by TimeRangeEndDay = startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-PolicyTrend": {
+ "runAfter": {
+ "Create_CSV_table-OptimizeGrid3": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| where PolicyUniqueId != \"\"\n| summarize ActivePolicyCount = dcount(strcat(VaultResourceId, PolicyUniqueId), 4) by TimeRangeEndDay = startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Set_variable-PolicyEmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-PolicyList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "PoliciesVisual",
+ "value": "\n
Active Policy Trend
\n
\n
?['attachmentName']}\")
\n
\n
Cloud Storage Trend
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT641 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT641
new file mode 100644
index 0000000..07ee287
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT641
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-backupinstances-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-backupinstances-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898507,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-backupinstances-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-backupinstances-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT641",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT641",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT642 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT642
new file mode 100644
index 0000000..5777f18
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT642
@@ -0,0 +1,802 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-backupinstances-report/azuredeploy.json",
+ "/demos/backup-backupinstances-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898523,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-backupinstances-report/azuredeploy.json",
+ "/demos/backup-backupinstances-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT642",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT642",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "BackupInstances",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at whch emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "Backup Instances",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "BackupInstances",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "Backup Instances",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "Backup Instances",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Attachments": [
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-BackupInstanceTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-BackupInstanceTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-CloudStorageTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-CloudStorageTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-BackupInstancesList'))}",
+ "Name": "BackupInstancesList.csv"
+ }
+ ],
+ "Body": "
\nBackup Instances Report
\n
\nEmail Contents
\n
\n1. Inline
a. Trend of Backup Instances count over time
b. Trend of Backup Cloud Storage (GB) over time
\n
\n2. Attachment
List of all backup instances with details on policy, backup storage consumed, storage replication type etc.
Learn more about Backup Reports
\n
\n@{variables('visual')}
\n
\n
\n
\n
",
+ "Subject": "Backup Instances",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForLatestData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n// DatasourceSetType\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true) \n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {union (LatestBackupItemAssociationAndStorageConsumptionTable | where (_RangeEnd-_RangeStart == 1d)), (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceTrendFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceTrendFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Trend')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceTrendFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "visual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForLatestData": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Latest",
+ "type": "string",
+ "value": "let _RangeStart = iff(( datetime(@{parameters('endDate')})== datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('endDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-NoDataMessage": {
+ "inputs": {
+ "variables": [
+ {
+ "name": "NoDataMessage",
+ "type": "array",
+ "value": [
+ {
+ "Message": "No records found"
+ }
+ ]
+ }
+ ]
+ },
+ "runAfter": {
+ "Initialize_variable-EmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable"
+ },
+ "Scope": {
+ "actions": {
+ "Create_CSV_table-BackupInstancesList": {
+ "runAfter": {
+ "Run_query_and_list_results-BackupInstancesList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-BackupInstancesList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-BackupInstancesList')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-BackupInstancesList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-CloudStorageTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceFunction')}\n| project Id, BackupInstance=FriendlyName, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=PolicyName, CloudStorage=VaultStore_StorageConsumptionInMBs/1024, Vault=VaultResourceId, StorageReplicationType=VaultStore_StorageReplicationType, AzureResource=DatasourceSetResourceId, DatasourceType",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-BackupInstanceTrend": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| summarize BackupItemCount = count(UniqueId) by startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-CloudStorageTrend": {
+ "runAfter": {
+ "Run_query_and_visualize_results-BackupInstanceTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| summarize StorageConsumedInGBs = sum(VaultStore_StorageConsumptionInMBs)/(1024) by TimeRangeEndDay = startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Set_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-BackupInstancesList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "visual",
+ "value": "\n
Backup Instances Trend
\n
\n
?['attachmentName']}\")
\n
\n
Cloud Storage Trend
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT643 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT643
new file mode 100644
index 0000000..09476a8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT643
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-jobs-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-jobs-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898536,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-jobs-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-jobs-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT643",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT643",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT644 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT644
new file mode 100644
index 0000000..0a744f4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT644
@@ -0,0 +1,815 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-jobs-report/azuredeploy.json",
+ "/demos/backup-jobs-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898546,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-jobs-report/azuredeploy.json",
+ "/demos/backup-jobs-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT644",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT644",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "Jobs",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at whch emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "Jobs",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "Jobs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "Jobs",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "Jobs",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Attachments": [
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-JobOperation')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-JobOperation')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-JobStatus')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-JobStatus')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-JobList'))}",
+ "Name": "JobList.csv"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-JobFailureCode')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-JobFailureCode')?['attachmentName']"
+ }
+ ],
+ "Body": "
\nJobs Report
\n
\nEmail Contents
\n
\n1. Inline
a. Jobs by Status over time
b. Jobs by Operation
c. Jobs by Failure Code\n
\n
2. Attachments
a. List of backup and restore jobs in selected time range
Learn more about Backup Reports
\n
\n@{variables('visual')}
\n
\n
\n
\n
\n
",
+ "Subject": "Jobs",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceTrendFunction": {
+ "runAfter": {
+ "Initialize_variable-JobFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceTrendFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Trend')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceTrendFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "visual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-JobFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "JobFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n// Report filters\n@{variables('ReportFilter_Trend')}\nlet _ProtectionStateList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _JobOperationList = \"*\";\nlet _JobStatusList = \"*\";\nlet _JobFailureCodeList = \"*\";\nlet _ExcludeLog = true;\n// Other Vars\nlet ExtRangeStart = _RangeStart - 2d;\nlet ExtRangeEnd = _RangeEnd + 2d;\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet JobUnderAzureDiagnostics = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AzureDiagnostics \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"Job\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n// Exclude Log Jobs and InProgress Jobs\n| project JobOperation = columnifexists(\"JobOperation_s\", \"\") , JobOperationSubType = columnifexists(\"JobOperationSubType_s\", \"\"), JobUniqueIdGuid = columnifexists(\"JobUniqueId_g\", \"\") , JobUniqueIdStr = columnifexists(\"JobUniqueId_s\", \"\"),\nProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), AdHocOrScheduledJob = columnifexists(\"AdHocOrScheduledJob_s\",\"\"), RecoveryJobDestination = columnifexists(\"RecoveryJobDestination_s\",\"\"),\nRecoveryJobRPDateTime = todatetime(columnifexists(\"RecoveryJobRPDateTime_s\",\"\")), RecoveryJobRPLocation = columnifexists(\"RecoveryJobRPLocation_s\",\"\"), RecoveryLocationType = columnifexists(\"RecoveryLocationType_s\",\"\"),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\",\"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\",\"\"),\nJobStatus = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode = columnifexists(\"JobFailureCode_s\",\"\"), JobStartDateTime = todatetime(columnifexists(\"JobStartDateTime_s\",\"\")), JobDurationInSecs = todouble(columnifexists(\"JobDurationInSecs_s\", \"\")),\nDataTransferredInMB = todouble(columnifexists(\"DataTransferredInMB_s\",\"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\",\"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog) \n| extend JobUniqueId = iff(JobUniqueIdGuid == \"\", JobUniqueIdStr, JobUniqueIdGuid) \n| project-away JobUniqueIdGuid, JobUniqueIdStr\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId ;\nJobTable\n};\nlet JobUnderResourceSpecific = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AddonAzureBackupJobs \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Job\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog)\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId;\nJobTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet LatestBackupItemWithProtectedContainerTable = () \n{\nTotalBackupItemDimensionTable\n| join (union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics()| where _ExcludeLegacyEvent == false),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId) on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet JobFinalTable = (){\n union isfuzzy = true \n(JobUnderAzureDiagnostics(true)| where _ExcludeLegacyEvent == false),\n(JobUnderResourceSpecific(true))\n| project JobStatus, JobUniqueId, JobOperation, JobFailureCode, JobOperationSubType, JobStartDateTime, DataTransferredInMB, AdHocOrScheduledJob, JobDurationInSecs, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId, ProtectedContainerUniqueId, TimeGenerated \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId\n| where JobOperation in~ (_JobOperationList) or '*' in (_JobOperationList)\n| where JobStatus in~ (_JobStatusList) or '*' in (_JobStatusList)\n| where JobFailureCode in~ (_JobFailureCodeList) or '*' in (_JobFailureCodeList)\n| join kind= inner (LatestBackupItemWithProtectedContainerTable) on BackupItemUniqueId\n| project JobUniqueId, JobOperation, JobStatus, JobFailureCode, JobOperationSubType, JobStartDateTime, JobDurationInSecs, DataTransferredInMB, AdHocOrScheduledJob, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId = BackupItemUniqueId1, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, StorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(JobFinalTable)))\n| project UniqueId = JobUniqueId, OperationCategory = JobOperation, Operation = JobOperationSubType, Status = JobStatus, ErrorTitle = JobFailureCode, StartTime = JobStartDateTime, DurationInSecs = JobDurationInSecs, DataTransferredInMBs = DataTransferredInMB, RestoreJobRPDateTime = RecoveryJobRPDateTime, RestoreJobRPLocation = RecoveryJobRPLocation, BackupInstanceUniqueId = BackupItemUniqueId, BackupInstanceId, BackupInstanceFriendlyName = BackupItemFriendlyName, DatasourceResourceId, DatasourceFriendlyName = BackupItemFriendlyName, DatasourceType, BackupSolution, DatasourceSetResourceId, DatasourceSetType, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-NoDataMessage": {
+ "inputs": {
+ "variables": [
+ {
+ "name": "NoDataMessage",
+ "type": "array",
+ "value": [
+ {
+ "Message": "No records found"
+ }
+ ]
+ }
+ ]
+ },
+ "runAfter": {
+ "Initialize_variable-EmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable"
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Scope": {
+ "actions": {
+ "Create_CSV_table-JobList": {
+ "runAfter": {
+ "Run_query_and_list_results-JobList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-JobList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-JobList')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-JobList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-JobFailureCode": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n| project BackupInstance=BackupInstanceFriendlyName, BackupInstanceId, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), OperationCategory, JobStatus=Status, JobStartDateTime=StartTime, JobDuration=DurationInSecs/3600, ErrorTitle, DataTransferred=DataTransferredInMBs, AzureResource=DatasourceSetResourceId, DatasourceType ",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-JobFailureCode": {
+ "runAfter": {
+ "Run_query_and_visualize_results-JobOperation": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n// query to transform function output\n| where Status == \"Failed\"\n| summarize JobFailureCode = any(ErrorTitle), JobOperation = any(OperationCategory) by UniqueId\n| summarize count(JobOperation) by JobFailureCode\n| sort by count_JobOperation",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Pie Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-JobOperation": {
+ "runAfter": {
+ "Run_query_and_visualize_results-JobStatus": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n// query to transform function output\n| summarize Status = any(Status), Operation = any(OperationCategory) by UniqueId\n| summarize count(Status) by Operation\n| sort by Operation",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Bar Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-JobStatus": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('JobFunction')}\n// query to transform function output\n| summarize arg_max(TimeGenerated, Status) by UniqueId\n| summarize count(Status) by Status, bin(TimeGenerated, 1d)\n| project TimeGenerated, count_Status, JobStatus = ( iff(Status == \"Completed\", \"Succeeded\", iff(Status == \"CompletedWithWarnings\", \"SucceededWithWarnings\", Status)))\n| sort by TimeGenerated asc",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Bar Chart"
+ }
+ }
+ },
+ "Set_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-JobList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "visual",
+ "value": "\n
Jobs by Status
\n
\n
?['attachmentName']}\")
\n
\n
Jobs by JobOperation
\n
\n
?['attachmentName']}\")
\n
\n
Jobs by Failure Code
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT645 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT645
new file mode 100644
index 0000000..d6c49ba
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT645
@@ -0,0 +1,502 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/nested/azure_alerts.json"
+ ],
+ "timestamp": 1642962898557,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/nested/azure_alerts.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT645",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/views"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT645",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "workspaceName/azure_alerts",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "properties": {
+ "Name": "Alerts from Azure Resources Backup",
+ "Author": "Microsoft",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts by Alert Type",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Alerts by Alert Type",
+ "Subtitle": "You can filter by Datasource Type by Clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\", \"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc ",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\", \"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Alert Type",
+ "Value": "No of Alerts"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi ( Selection ) on AlertType_s | project AlertUniqueId, AlertType_s, TimeGenerated, AlertStatus_s, BackupItemUniqueId_s ",
+ "NavigationSelect": {
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi ( Selection ) on AlertType_s | project AlertUniqueId, AlertType_s, TimeGenerated, AlertStatus_s, BackupItemUniqueId_s "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts Created vs Alerts Resolved",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Trend1": {
+ "Legend": "Alerts Created",
+ "LegendColor": "#00188f",
+ "ChartQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\", \"\" ), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\", \"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(AlertUniqueId) by bin(TimeGenerated,1h)",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "Trend2": {
+ "Legend": "Alerts Resolved",
+ "LegendColor": "#0072c6",
+ "ChartQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\") , BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\"| project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_s | where AlertStatus_s==\"Resolved\"; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(AlertUniqueId) by bin(TimeGenerated,1h)",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\"); Alerts | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by AlertUniqueId | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend CurrentStatus = AlertStatus_s | join kind=leftouter ( Alerts | summarize arg_max(TimeGenerated,*) by TimeGenerated, AlertUniqueId | summarize HitCount = count() by AlertUniqueId ) on AlertUniqueId | project AlertUniqueId , AlertStatus_s, AlertType_s, HitCount | sort by AlertStatus_s asc, HitCount desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Alert Unique ID",
+ "Value": "Hit Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\"| extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by AlertUniqueId | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend CurrentStatus = AlertStatus_s | join kind=leftouter ( Alerts | summarize arg_max(TimeGenerated,*) by TimeGenerated, AlertUniqueId | summarize HitCount = count() by AlertUniqueId ) on AlertUniqueId | project AlertUniqueId , AlertStatus_s, AlertCode_s, AlertType_s, HitCount | sort by AlertStatus_s asc, HitCount desc | search {selected item}; Alerts | join kind=inner(Selection) on AlertUniqueId | summarize arg_max(TimeGenerated, *) by AlertUniqueId |project TimeGenerated, AlertUniqueId, BackupItemUniqueId_s, AlertType_s, AlertCode_s, AlertStatus_s, HitCount",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\"| extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by AlertUniqueId | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend CurrentStatus = AlertStatus_s | join kind=leftouter ( Alerts | summarize arg_max(TimeGenerated,*) by TimeGenerated, AlertUniqueId | summarize HitCount = count() by AlertUniqueId ) on AlertUniqueId | project AlertUniqueId , AlertStatus_s, AlertCode_s, AlertType_s, HitCount | sort by AlertStatus_s asc, HitCount desc | search {selected item}; Alerts | join kind=inner(Selection) on AlertUniqueId | summarize arg_max(TimeGenerated, *) by AlertUniqueId |project TimeGenerated, AlertUniqueId, BackupItemUniqueId_s, AlertType_s, AlertCode_s, AlertStatus_s, HitCount"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Active Alerts by Severity",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Alerts by Severity",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\", \"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_s; Alerts | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | where AlertUniqueId_s != \"\" | where AlertStatus_s==\"Active\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Critical",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "Warning",
+ "color": "#ff8c00"
+ },
+ {
+ "value": "Information",
+ "color": "#fff100"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\", \"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_s; Alerts | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | where AlertUniqueId_s != \"\" | where AlertStatus_s==\"Active\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc ",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Alert Severity",
+ "Value": "No of Alerts"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s |where AlertStatus_s==\"Active\" | project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, TimeGenerated ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s |where AlertStatus_s==\"Active\" | project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, TimeGenerated "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Resolved Alerts by Severity",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Resolved Alerts by Severity",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\", \"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_s; Alerts | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | where AlertUniqueId_s != \"\" | where AlertStatus_s==\"Resolved\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Critical",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "Warning",
+ "color": "#ff8c00"
+ },
+ {
+ "value": "Information",
+ "color": "#fff100"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\", \"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_s; Alerts | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | where AlertUniqueId_s != \"\" | where AlertStatus_s==\"Resolved\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc ",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Alert Severity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s |where AlertStatus_s==\"Resolved\" | project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, TimeGenerated ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s |where AlertStatus_s==\"Resolved\" | project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, TimeGenerated "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Avg Alert Resolution Time per week (hrs)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Avg Alert Resolution Time per week (hrs)",
+ "Subtitle": "Stretch the time axis to see the trend (above time filter)"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\"); let AlertStarts= Alerts |summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds= Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | summarize avg(timeToResolveInHrs) by bin(Alert_TimeGenerated,7d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\"); let AlertStarts= Alerts |summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds= Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | summarize avg(timeToResolveInHrs) by bin(Alert_TimeGenerated,7d)",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Week Start",
+ "Value": "Average resolution Time (hrs)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend TimeGenerated=columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\", \"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId = columnifexists(\"AlertUniqueId_s\", \"AlertUniqueId_g\"), Alert_TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts= Alerts | summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | extend weekStart=bin(TimeGenerated,7d) | summarize avg(timeToResolveInHrs) by weekStart",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend TimeGenerated=columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\", \"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId = columnifexists(\"AlertUniqueId_s\", \"AlertUniqueId_g\"), Alert_TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts= Alerts | summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | extend weekStart=bin(TimeGenerated,7d) | summarize avg(timeToResolveInHrs) by weekStart"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top 3 backup Items by Avg Alert Resolution time",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Breakup by Avg Alert Resolution time (hrs)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_s\", \"AlertUniqueId_g\")|where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName=columnifexists(\"BackupItemFriendlyName_s2\",\"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId = columnifexists (\"AlertUniqueId_s\", \"AlertUniqueId_g\")|where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s2\",\"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item Id",
+ "Value": "Avg Alerts Resolution Time"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_s\", \"AlertUniqueId_g\")|where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s2\",\"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_s\", \"AlertUniqueId_g\")|where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s2\",\"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc | search {selected item}"
+ }
+ }
+ }
+ }
+ ],
+ "Filters": [
+ {
+ "FieldName": "BackupItemType_s",
+ "QueryForValues": "AzureDiagnostics | where Category == \"AzureBackupReport\" |distinct BackupItemType_s",
+ "Title": "DatasourceType"
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "TileOne": {
+ "Legend": "Alerts Created in Period",
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\"| where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId | count "
+ },
+ "TileTwo": {
+ "Legend": "Active Alerts Created in Period",
+ "Query": " AzureDiagnostics | where Category == \"AzureBackupReport\"| where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s == \"Active\" |count "
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT646 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT646
new file mode 100644
index 0000000..b28b9d9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT646
@@ -0,0 +1,334 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/nested/backup_items.json"
+ ],
+ "timestamp": 1642962898569,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/nested/backup_items.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT646",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/views"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT646",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "workspaceName/backup_items",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "properties": {
+ "Name": "Backup Items",
+ "Author": "Microsoft",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Backup Items by Backup Item Type",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Backup Items by Backup Item Type",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName == \"BackupItem\"; BackupItems | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\") , BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemUniqueId_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | where ${DatasourceType} | summarize count(BackupItemUniqueId_s) by BackupItemType_s | sort by count_BackupItemUniqueId_s desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems=Events | where OperationName==\"BackupItem\"; BackupItems | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") , BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") , BackupManagementType_s = columnifexists(\"BackupManagementType_s\", \"\") , TimeGenerated = columnifexists(\"TimeGenerated\",\"\")| where BackupItemUniqueId_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | where ${DatasourceType} | summarize count(BackupItemUniqueId_s) by BackupItemType_s, BackupManagementType_s | sort by count_BackupItemUniqueId_s desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Datasource Type",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems=Events | where OperationName==\"BackupItem\"; BackupItems | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemProtectionState_s = columnifexists(\"BackupItemProtectionState_s\",\"\") | where BackupItemUniqueId_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | where ${DatasourceType} | summarize count(BackupItemUniqueId_s) by BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s | project-away count_BackupItemUniqueId_s | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems=Events | where OperationName==\"BackupItem\"; BackupItems | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemProtectionState_s = columnifexists(\"BackupItemProtectionState_s\",\"\") | where BackupItemUniqueId_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | where ${DatasourceType} | summarize count(BackupItemUniqueId_s) by BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s | project-away count_BackupItemUniqueId_s | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Backup Items by Protection status",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Last Known Protection Status"
+ },
+ "Donut": {
+ "Query": "let BackupItems = AzureDiagnostics | where SchemaVersion_s==\"V2\" | where Category == \"AzureBackupReport\" | where OperationName==\"BackupItem\"; BackupItems | extend BackupItemProtectionState_s = columnifexists(\"BackupItemProtectionState_s\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\") , TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s =columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemProtectionState_s != \"\" | where ${DatasourceType} | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | summarize count(BackupItemUniqueId_s) by BackupItemProtectionState_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#ff8c00",
+ "#55d455",
+ "#6dc2e9"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let BackupItems = AzureDiagnostics | where SchemaVersion_s==\"V2\" | where Category == \"AzureBackupReport\" | where OperationName==\"BackupItem\"; BackupItems | extend BackupItemProtectionState_s = columnifexists(\"BackupItemProtectionState_s\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\") | where BackupItemProtectionState_s != \"\" | where ${DatasourceType} | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | summarize count(BackupItemUniqueId_s) by BackupManagementType_s, BackupItemProtectionState_s",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Management Type",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let BackupItems = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName==\"BackupItem\" | where SchemaVersion_s==\"V2\" ; BackupItems | extend BackupItemProtectionState_s=columnifexists(\"BackupItemProtectionState_s\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s= columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\") | where BackupItemProtectionState_s != \"\" and BackupItemType_s != \"\" | where ${DatasourceType} | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let BackupItems = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName==\"BackupItem\" | where SchemaVersion_s==\"V2\" ; BackupItems | extend BackupItemProtectionState_s=columnifexists(\"BackupItemProtectionState_s\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s= columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\") | where BackupItemProtectionState_s != \"\" and BackupItemType_s != \"\" | where ${DatasourceType} | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top 3 Backup Items by Alerts Generated",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Top 3 Backup Items by Alerts Generated"
+ },
+ "Donut": {
+ "Query": "let BackupIdNameMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"),BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=(AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId ) | union kind=outer (AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId) |extend startTime=TimeGenerated ; Alerts | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | summarize count(AlertUniqueId) by BackupItemFriendlyName | sort by count_AlertUniqueId desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let BackupIdNameMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\")| where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=(AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId ) | union kind=outer (AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId) |extend startTime=TimeGenerated ; Alerts | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s1\",\"BackupItemUniqueId_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\", \"BackupItemFriendlyName_s\")| where ${DatasourceType} | summarize count(AlertUniqueId) by BackupItemUniqueId, BackupItemFriendlyName | sort by count_AlertUniqueId desc ",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let BackupIdNameMap = AzureDiagnostics | where Category == \"AzureBackupReport\" |where SchemaVersion_s==\"V2\" | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=(AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\") |where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId ) | union kind=outer (AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId) |extend startTime=TimeGenerated ; Alerts | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType} | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": " let BackupIdNameMap = AzureDiagnostics | where Category == \"AzureBackupReport\" |where SchemaVersion_s==\"V2\" | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=(AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\") |where BackupManagementType_s !in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_s\",\"AlertUniqueId_g\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId ) | union kind=outer (AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId) |extend startTime=TimeGenerated ; Alerts | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType} | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Backup Items by Last Successful Backup Time",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Backup Items",
+ "Query": "let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; BackupIdTypeMap | summarize dcount(BackupItemUniqueId_s)"
+ },
+ "SecondTile": {
+ "Legend": "Backup Jobs",
+ "Query": "let Events= AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName==\"Job\" | extend JobOperation_s=columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g=columnifexists(\"JobUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\")| where JobOperation_s==\"Backup\" | where JobUniqueId_g!=\"\" | summarize arg_max(TimeGenerated, *) by JobUniqueId_g ; let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; Jobs | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) "
+ },
+ "List": {
+ "Query": "let BackupIdNameMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName==\"BackupItem\" | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s ,BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let LastSuccessfulBackupJobs = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g=columnifexists(\"JobUniqueId_g\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where JobOperation_s == \"Backup\" | where JobStatus_s == \"Completed\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, Job_TimeGenerated; LastSuccessfulBackupJobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType} | project BackupItemUniqueId_s, BackupItemFriendlyName_s, Job_TimeGenerated | sort by Job_TimeGenerated desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Last Successful Backup Time"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let BackupIdNameMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName==\"BackupItem\" | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s ,BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let LastSuccessfulBackupJobs = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g=columnifexists(\"JobUniqueId_g\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where JobOperation_s == \"Backup\" | where JobStatus_s == \"Completed\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, Job_TimeGenerated; LastSuccessfulBackupJobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType} | project-away BackupItem_TimeGenerated | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let BackupIdNameMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName==\"BackupItem\" | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s ,BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let LastSuccessfulBackupJobs = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g=columnifexists(\"JobUniqueId_g\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where JobOperation_s == \"Backup\" | where JobStatus_s == \"Completed\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, Job_TimeGenerated; LastSuccessfulBackupJobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType} | project-away BackupItem_TimeGenerated | search {selected item}"
+ }
+ }
+ }
+ }
+ ],
+ "Filters": [
+ {
+ "FieldName": "BackupItemType_s",
+ "QueryForValues": "AzureDiagnostics | where Category == \"AzureBackupReport\"|distinct BackupItemType_s",
+ "Title": "DatasourceType"
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Tile": {
+ "Legend": "Backup Items",
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | distinct BackupItemUniqueId_s | count"
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT647 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT647
new file mode 100644
index 0000000..04da189
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT647
@@ -0,0 +1,628 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/nested/backup_jobs_log.json"
+ ],
+ "timestamp": 1642962898585,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/nested/backup_jobs_log.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT647",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/views"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT647",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "workspaceName/backup_jobs_log",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "properties": {
+ "Name": "Backup Jobs (Log)",
+ "Author": "Microsoft",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Status",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Status",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": " let Events= AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"); let Jobs = Events | where OperationName == \"Job\" |extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"); Jobs | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\", \"Recovery point_Log\") | join kind=leftouter ( BackupItems ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "CompletedWithWarnings",
+ "color": "#ffb900"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName ==\"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"); let BackupItems = Events | where OperationName ==\"BackupItem\" | extend BackupItemType_s= columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s ) on BackupItemUniqueId_s| where ${DatasourceType} | project BackupItemFriendlyName_s, BackupItemUniqueId_s, JobStatus_s, Vault=Resource | summarize count() by BackupItemUniqueId_s , BackupItemFriendlyName_s, JobStatus_s, Vault | order by count_ desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events=AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"); let BackupItems = Events | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\" , \"\"); let ProtectedContainers = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists (\"ProtectedContainerUniqueId_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( ProtectedContainers | summarize arg_max(TimeGenerated,*) by ProtectedContainerUniqueId_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Vault=Resource, JobFailureCode_s | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events=AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"); let BackupItems = Events | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\" , \"\"); let ProtectedContainers = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists (\"ProtectedContainerUniqueId_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( ProtectedContainers | summarize arg_max(TimeGenerated,*) by ProtectedContainerUniqueId_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Vault=Resource, JobFailureCode_s | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top 3 Backup Items by Job Duration",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Job Duration (Hrs)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" ; let BackupIdNameMap = BackupItems | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s= columnifexists (\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s==\"Log\" or JobOperationSubType_s == \"Recovery point_Log\" | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s | sort by totalDurationInHrs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Total Job Duration (hrs)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName ==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobDurationInSecs_s = columnifexists (\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobStatus_s, JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; let Selection = Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc | search {selected item} | join ( BackupIdNameMap ) on BackupItemFriendlyName_s; Selection | join(Jobs) on BackupItemUniqueId_s ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName ==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobDurationInSecs_s = columnifexists (\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobStatus_s, JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; let Selection = Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc | search {selected item} | join ( BackupIdNameMap ) on BackupItemFriendlyName_s; Selection | join(Jobs) on BackupItemUniqueId_s "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Total Data Transferred",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Total Data Transferred (MB)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" ; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists (\"JobUniqueId_g\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\", \"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\")| where JobOperation_s==\"Backup\" | where JobOperationSubType_s==\"Log\" or JobOperationSubType_s == \"Recovery point_Log\" | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\", \"BackupItemType_s\") | where ${DatasourceType} | summarize sum(todouble(DataTransferredInMB_s)) by bin(TimeGenerated, 1d), JobOperation_s",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\") , TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\", \"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Total Data Transferred (MB)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\", \"\") , JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\",\"\") | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\", \"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithTotalDataTransferred = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc | search {selected item}; JobsWithTotalDataTransferred | join(Jobs| where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\")) on BackupItemUniqueId_s | project JobUniqueId_g, TimeGenerated, DataTransferredInMB_s, JobStatus_s, ProtectedContainerUniqueId_s, BackupItemUniqueId_s, BackupItemFriendlyName, JobOperation_s",
+ "NavigationSelect": {
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\", \"\") , JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\",\"\") | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\", \"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithTotalDataTransferred = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc | search {selected item}; JobsWithTotalDataTransferred | join(Jobs| where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\")) on BackupItemUniqueId_s | project JobUniqueId_g, TimeGenerated, DataTransferredInMB_s, JobStatus_s, ProtectedContainerUniqueId_s, BackupItemUniqueId_s, BackupItemFriendlyName, JobOperation_s"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed Backup Job Count per day",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Failed Backup Job Count per day",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Failed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend JobDate = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, JobDate, timeOfJob | project timeOfJob, BackupItemFriendlyName, JobDate, FailedBackupJobCount=count_JobUniqueId_g | sort by JobDate asc | summarize sum(toint(FailedBackupJobCount)) by bin(timeOfJob, 1d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\") , BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend JobStatus_s = columnifexists(\"JobStatus_s\", \"\"),BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Failed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemFriendlyName, BackupItemUniqueId_s, Job_Date | project BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, FailedBackupJobCount=count_JobUniqueId_g | sort by Job_Date asc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "#Failed Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") | where ${DatasourceType}; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let BackupIdNameMap = BackupItems |extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s, BackupItemType_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob | project BackupItemUniqueId_s,BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob| sort by Job_Date desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") | where ${DatasourceType}; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let BackupIdNameMap = BackupItems |extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s, BackupItemType_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob | project BackupItemUniqueId_s,BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob| sort by Job_Date desc | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Successful Backup Job Count Per Day",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Successful Backup Job Count Per Day",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s, BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; SuccessfulBackupJobs | extend JobDate = format_datetime(TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, JobDate, timeOfJob | project timeOfJob, BackupItemFriendlyName, JobDate, SuccessfulBackupJobCount=count_JobUniqueId_g | sort by JobDate asc | summarize sum(SuccessfulBackupJobCount) by bin(timeOfJob, 1d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\") | where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date | project BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, SuccessfulBackupJobCount=count_JobUniqueId_g | sort by Job_Date desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "#Successful Backup Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count() by BackupItemUniqueId_s, BackupItemFriendlyName=columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\"), Job_Date, timeOfJob, JobUniqueId_g, JobStatus_s, ProtectedContainerUniqueId_s | sort by Job_Date desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count() by BackupItemUniqueId_s, BackupItemFriendlyName=columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\"), Job_Date, timeOfJob, JobUniqueId_g, JobStatus_s, ProtectedContainerUniqueId_s | sort by Job_Date desc | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed Jobs by Failure Code",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Failed jobs by Failure Code",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists (\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by JobFailureCode_s | sort by count_JobUniqueId_g desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists (\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by JobFailureCode_s | sort by count_JobUniqueId_g desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Failure Code",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs=Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs=Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Creation Time",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Creation Time",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3) | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | project timeBucketStart24, timeBucketStart12 , timeBucketEnd12 , timeBucketStartMeridian , timeBucketEndMeridian , count_JobUniqueId_g | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | summarize noOfJobs=sum(count_JobUniqueId_g) by timeBucketString | sort by noOfJobs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3) | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | project timeBucketStart24, timeBucketStart12 , timeBucketEnd12 , timeBucketStartMeridian , timeBucketEndMeridian , count_JobUniqueId_g | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | summarize noOfJobs=sum(count_JobUniqueId_g) by timeBucketString | sort by noOfJobs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Time of Day",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName == \"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated= columnifexists(\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s=columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g; let JobsWithTimeBucket = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | sort by count_JobUniqueId_g desc; let Selection=JobsWithTimeBucket | search {selected item}; Selection | join( JobsWithTimeBucket) on timeBucketString | project TimeOfDay=timeBucketString, JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName == \"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated= columnifexists(\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s=columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g; let JobsWithTimeBucket = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | sort by count_JobUniqueId_g desc; let Selection=JobsWithTimeBucket | search {selected item}; Selection | join( JobsWithTimeBucket) on timeBucketString | project TimeOfDay=timeBucketString, JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Duration",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Duration",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\", \"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") |summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600) | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | summarize noOfJobs= sum(count_JobUniqueId_g) by JobDurationString | sort by noOfJobs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\", \"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" , \"Recovery point_Log\") |summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600) | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | summarize noOfJobs= sum(count_JobUniqueId_g) by JobDurationString | sort by noOfJobs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Job Duration",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\"), ProtectedContainerUniqueId_s =columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s=columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g; let BackupIdTypeMap = BackupItems |extend BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithDurationString = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" ,\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | sort by count_JobUniqueId_g desc; let Selection = JobsWithDurationString | search {selected item}; Selection | join ( JobsWithDurationString ) on JobDurationString | project JobDurationString,JobUniqueId_g, JobStatus_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\"), ProtectedContainerUniqueId_s =columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s=columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g; let BackupIdTypeMap = BackupItems |extend BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithDurationString = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s in~(\"Log\" ,\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | sort by count_JobUniqueId_g desc; let Selection = JobsWithDurationString | search {selected item}; Selection | join ( JobsWithDurationString ) on JobDurationString | project JobDurationString,JobUniqueId_g, JobStatus_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s "
+ }
+ }
+ }
+ }
+ ],
+ "Filters": [
+ {
+ "FieldName": "BackupItemType_s",
+ "QueryForValues": "AzureDiagnostics | where Category == \"AzureBackupReport\"| distinct BackupItemType_s",
+ "Title": "DatasourceType"
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" | extend JobOperation_s=columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s in~(\"Log\",\"Recovery point_Log\") | summarize dcount(JobUniqueId_g) by JobStatus_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "CompletedWithWarnings",
+ "color": "#ffb900"
+ }
+ ]
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT648 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT648
new file mode 100644
index 0000000..c2dbf04
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT648
@@ -0,0 +1,628 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/nested/backup_jobs_non_log.json"
+ ],
+ "timestamp": 1642962898607,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/nested/backup_jobs_non_log.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT648",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/views"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT648",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "workspaceName/backup_jobs_non_log",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "properties": {
+ "Name": "Backup Jobs (Non Log)",
+ "Author": "Microsoft",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Status",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Status",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": " let Events= AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"); let Jobs = Events | where OperationName == \"Job\" |extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"); Jobs | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\", \"Recovery point_Log\") | join kind=leftouter ( BackupItems ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "CompletedWithWarnings",
+ "color": "#ffb900"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName ==\"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"); let BackupItems = Events | where OperationName ==\"BackupItem\" | extend BackupItemType_s= columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s ) on BackupItemUniqueId_s| where ${DatasourceType} | project BackupItemFriendlyName_s, BackupItemUniqueId_s, JobStatus_s, Vault=Resource | summarize count() by BackupItemUniqueId_s , BackupItemFriendlyName_s, JobStatus_s, Vault | order by count_ desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events=AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"); let BackupItems = Events | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\" , \"\"); let ProtectedContainers = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists (\"ProtectedContainerUniqueId_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( ProtectedContainers | summarize arg_max(TimeGenerated,*) by ProtectedContainerUniqueId_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Vault=Resource, JobFailureCode_s | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events=AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"); let BackupItems = Events | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\" , \"\"); let ProtectedContainers = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists (\"ProtectedContainerUniqueId_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( ProtectedContainers | summarize arg_max(TimeGenerated,*) by ProtectedContainerUniqueId_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Vault=Resource, JobFailureCode_s | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top 3 Backup Items by Job Duration",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Job Duration (Hrs)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" ; let BackupIdNameMap = BackupItems | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s= columnifexists (\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\", \"Recovery point_Log\" )| summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s | sort by totalDurationInHrs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Total Job Duration (hrs)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName ==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobDurationInSecs_s = columnifexists (\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobStatus_s, JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; let Selection = Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc | search {selected item} | join ( BackupIdNameMap ) on BackupItemFriendlyName_s; Selection | join(Jobs) on BackupItemUniqueId_s ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName ==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobDurationInSecs_s = columnifexists (\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobStatus_s, JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; let Selection = Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc | search {selected item} | join ( BackupIdNameMap ) on BackupItemFriendlyName_s; Selection | join(Jobs) on BackupItemUniqueId_s "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Total Data Transferred",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Total Data Transferred (MB)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" ; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists (\"JobUniqueId_g\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\", \"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\")| where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\", \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\", \"BackupItemType_s\") | where ${DatasourceType} | summarize sum(todouble(DataTransferredInMB_s)) by bin(TimeGenerated, 1d), JobOperation_s",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\") , TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\", \"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Total Data Transferred (MB)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\", \"\") , JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\",\"\") | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\", \"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithTotalDataTransferred = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc | search {selected item}; JobsWithTotalDataTransferred | join(Jobs| where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\")) on BackupItemUniqueId_s | project JobUniqueId_g, TimeGenerated, DataTransferredInMB_s, JobStatus_s, ProtectedContainerUniqueId_s, BackupItemUniqueId_s, BackupItemFriendlyName, JobOperation_s",
+ "NavigationSelect": {
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\", \"\") , JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\",\"\") | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\", \"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithTotalDataTransferred = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc | search {selected item}; JobsWithTotalDataTransferred | join(Jobs| where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\")) on BackupItemUniqueId_s | project JobUniqueId_g, TimeGenerated, DataTransferredInMB_s, JobStatus_s, ProtectedContainerUniqueId_s, BackupItemUniqueId_s, BackupItemFriendlyName, JobOperation_s"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed Backup Job Count Per Day",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Failed Backup Job Count Per Day",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Failed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend JobDate = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, JobDate, timeOfJob | project timeOfJob, BackupItemFriendlyName, JobDate, FailedBackupJobCount=count_JobUniqueId_g | sort by JobDate asc | summarize sum(toint(FailedBackupJobCount)) by bin(timeOfJob, 1d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\") , BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend JobStatus_s = columnifexists(\"JobStatus_s\", \"\"),BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Failed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemFriendlyName, BackupItemUniqueId_s, Job_Date | project BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, FailedBackupJobCount=count_JobUniqueId_g | sort by Job_Date asc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item Id",
+ "Value": "#Failed Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") | where ${DatasourceType}; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let BackupIdNameMap = BackupItems |extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s, BackupItemType_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob | project BackupItemUniqueId_s,BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob| sort by Job_Date desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") | where ${DatasourceType}; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let BackupIdNameMap = BackupItems |extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s, BackupItemType_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob | project BackupItemUniqueId_s,BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob| sort by Job_Date desc | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Successful Backup Job Count Per Day",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Successful Backup Job Count Per Day",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s, BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; SuccessfulBackupJobs | extend JobDate = format_datetime(TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, JobDate, timeOfJob | project timeOfJob, BackupItemFriendlyName, JobDate, SuccessfulBackupJobCount=count_JobUniqueId_g | sort by JobDate asc | summarize sum(SuccessfulBackupJobCount) by bin(timeOfJob, 1d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\") | where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date | project BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, SuccessfulBackupJobCount=count_JobUniqueId_g | sort by Job_Date desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "#Successful Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count() by BackupItemUniqueId_s, BackupItemFriendlyName=columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\"), Job_Date, timeOfJob, JobUniqueId_g, JobStatus_s, ProtectedContainerUniqueId_s | sort by Job_Date desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count() by BackupItemUniqueId_s, BackupItemFriendlyName=columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\"), Job_Date, timeOfJob, JobUniqueId_g, JobStatus_s, ProtectedContainerUniqueId_s | sort by Job_Date desc | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed Jobs by Failure Code",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Failed jobs by Failure Code",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists (\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by JobFailureCode_s | sort by count_JobUniqueId_g desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists (\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by JobFailureCode_s | sort by count_JobUniqueId_g desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Failure Code",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs=Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs=Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Creation Time",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Creation Time",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3) | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | project timeBucketStart24, timeBucketStart12 , timeBucketEnd12 , timeBucketStartMeridian , timeBucketEndMeridian , count_JobUniqueId_g | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | summarize noOfJobs=sum(count_JobUniqueId_g) by timeBucketString | sort by noOfJobs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3) | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | project timeBucketStart24, timeBucketStart12 , timeBucketEnd12 , timeBucketStartMeridian , timeBucketEndMeridian , count_JobUniqueId_g | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | summarize noOfJobs=sum(count_JobUniqueId_g) by timeBucketString | sort by noOfJobs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Time of Day",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName == \"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated= columnifexists(\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s=columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g; let JobsWithTimeBucket = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | sort by count_JobUniqueId_g desc; let Selection=JobsWithTimeBucket | search {selected item}; Selection | join( JobsWithTimeBucket) on timeBucketString | project TimeOfDay=timeBucketString, JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName == \"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated= columnifexists(\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s=columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" ,\"Recovery point_Log\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g; let JobsWithTimeBucket = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | sort by count_JobUniqueId_g desc; let Selection=JobsWithTimeBucket | search {selected item}; Selection | join( JobsWithTimeBucket) on timeBucketString | project TimeOfDay=timeBucketString, JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Duration",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Duration",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\", \"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") |summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600) | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | summarize noOfJobs= sum(count_JobUniqueId_g) by JobDurationString | sort by noOfJobs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\", \"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" , \"Recovery point_Log\") |summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600) | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | summarize noOfJobs= sum(count_JobUniqueId_g) by JobDurationString | sort by noOfJobs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Job Duration",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\"), ProtectedContainerUniqueId_s =columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s=columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g; let BackupIdTypeMap = BackupItems |extend BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithDurationString = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" ,\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | sort by count_JobUniqueId_g desc; let Selection = JobsWithDurationString | search {selected item}; Selection | join ( JobsWithDurationString ) on JobDurationString | project JobDurationString,JobUniqueId_g, JobStatus_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\"), ProtectedContainerUniqueId_s =columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s=columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g; let BackupIdTypeMap = BackupItems |extend BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithDurationString = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s==\"Backup\" | where JobOperationSubType_s !in~(\"Log\" ,\"Recovery point_Log\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | sort by count_JobUniqueId_g desc; let Selection = JobsWithDurationString | search {selected item}; Selection | join ( JobsWithDurationString ) on JobDurationString | project JobDurationString,JobUniqueId_g, JobStatus_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s "
+ }
+ }
+ }
+ }
+ ],
+ "Filters": [
+ {
+ "FieldName": "BackupItemType_s",
+ "QueryForValues": "AzureDiagnostics | where Category == \"AzureBackupReport\" |distinct BackupItemType_s",
+ "Title": "DatasourceType"
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" | extend JobOperation_s=columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s !in~(\"Log\",\"Recovery point_Log\") | summarize dcount(JobUniqueId_g) by JobStatus_s ",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#e81123"
+ },
+ {
+ "value": "CompletedWithWarnings",
+ "color": "#ffb900"
+ }
+ ]
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT649 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT649
new file mode 100644
index 0000000..54c18bd
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT649
@@ -0,0 +1,276 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/nested/cloud_storage.json"
+ ],
+ "timestamp": 1642962898625,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/nested/cloud_storage.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT649",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/views"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT649",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "workspaceName/cloud_storage",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "properties": {
+ "Name": "Cloud Storage",
+ "Author": "Microsoft",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Total Cloud Storage Consumed (GB)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Trend1": {
+ "Legend": "GRS (avg)",
+ "LegendColor": "#00188f",
+ "ChartQuery": "let VaultIdRepMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Vault\" | extend StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), VaultUniqueId_s=columnifexists(\"VaultUniqueId_s\",\"\") | summarize arg_max(TimeGenerated, *) by VaultUniqueId_s | where StorageReplicationType_s == \"GeoRedundant\" ; let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Storages= AzureDiagnostics | where Category == \"AzureBackupReport\" |where OperationName == \"Storage\" |extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s=columnifexists(\"StorageType_s\", \"\") |summarize arg_max(TimeGenerated, *) by StorageUniqueId_s | project StorageUniqueId_s, StorageType_s | extend storage_type=StorageType_s; let StorageAssociations = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s=columnifexists(\"StorageConsumedInMBs_s\",\"\"), StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), VaultUniqueId_s=columnifexists(\"VaultUniqueId_s\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, VaultUniqueId_s, StorageUniqueId_s, TimeGenerated; StorageAssociations | join kind=inner ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | join kind=inner( VaultIdRepMap ) on VaultUniqueId_s | join kind=inner ( Storages ) on StorageUniqueId_s | where storage_type==\"Cloud\" | summarize arg_max(TimeGenerated,dayCharge=StorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d) | summarize TotalCharge = sum(dayCharge) by TimeGenerated",
+ "Calculation": {
+ "Operation": "Average"
+ }
+ },
+ "Trend2": {
+ "Legend": "LRS (avg)",
+ "LegendColor": "#0072c6",
+ "ChartQuery": "let VaultIdRepMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Vault\" | extend StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), VaultUniqueId_s=columnifexists(\"VaultUniqueId_s\",\"\") |where StorageReplicationType_s != \"\" | summarize arg_max(TimeGenerated, *) by VaultUniqueId_s | where StorageReplicationType_s == \"LocallyRedundant\" ; let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Storages= AzureDiagnostics | where Category == \"AzureBackupReport\" |where OperationName == \"Storage\" |extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s=columnifexists(\"StorageType_s\", \"\") |summarize arg_max(TimeGenerated, *) by StorageUniqueId_s | project StorageUniqueId_s, StorageType_s | extend storage_type=StorageType_s; let StorageAssociations = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s=columnifexists(\"StorageConsumedInMBs_s\",\"\"), StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), VaultUniqueId_s=columnifexists(\"VaultUniqueId_s\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, VaultUniqueId_s, StorageUniqueId_s, TimeGenerated; StorageAssociations | join kind=inner ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | join ( VaultIdRepMap ) on VaultUniqueId_s | join kind=inner ( Storages ) on StorageUniqueId_s | where storage_type==\"Cloud\" | summarize arg_max(TimeGenerated,dayCharge=StorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d) | summarize TotalCharge = sum(dayCharge) by TimeGenerated",
+ "Calculation": {
+ "Operation": "Average"
+ }
+ },
+ "List": {
+ "Query": "let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s=columnifexists(\"BackupItemFriendlyName_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, item_name=BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let StorageAssociations = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), StorageName_s=columnifexists(\"StorageName_s\",\"\") | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s, StorageUniqueId_s; let Storages=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | extend StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s=columnifexists(\"StorageType_s\",\"\"), StorageName_s=columnifexists(\"StorageName_s\",\"\")| distinct StorageUniqueId_s, StorageType_s, StorageName_s; StorageAssociations | join kind=inner ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\", \"BackupItemType_s\") | extend StorageConsumedInMBs_s=columnifexists(\"StorageConsumedInMBs_s\",\"\") | where ${DatasourceType} | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, StorageName_s, item_name | join kind=inner ( Storages ) on StorageUniqueId_s | project StorageUniqueId_s, StorageName_s, StorageInGB, BackupItemUniqueId_s, StorageType_s, item_name | where StorageType_s==\"Cloud\" | project BackupItemUniqueId_s, BackupItemFriendlyName=item_name , StorageInGB| order by StorageInGB desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Storage (GB)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s=columnifexists(\"BackupItemFriendlyName_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, item_name=BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let StorageAssociations = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageConsumedInMBs_s = columnifexists (\"StorageConsumedInMBs_s\",\"\") |summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s, StorageUniqueId_s; let Storages=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | extend StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s=columnifexists(\"StorageType_s\",\"\") |distinct StorageUniqueId_s, StorageType_s; StorageAssociations | join kind=inner ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, item_name | join kind= inner( Storages ) on StorageUniqueId_s | project StorageInGB, BackupItemUniqueId_s, StorageType_s, item_name, StorageUniqueId_s | where StorageType_s==\"Cloud\" | project StorageInGB, BackupItemFriendlyName=item_name, BackupItemUniqueId_s, StorageUniqueId_s | order by StorageInGB desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": " let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s=columnifexists(\"BackupItemFriendlyName_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, item_name=BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let StorageAssociations = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageConsumedInMBs_s = columnifexists (\"StorageConsumedInMBs_s\",\"\") |summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s, StorageUniqueId_s; let Storages=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | extend StorageUniqueId_s=columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s=columnifexists(\"StorageType_s\",\"\") |distinct StorageUniqueId_s, StorageType_s; StorageAssociations | join kind=inner ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, item_name | join kind= inner( Storages ) on StorageUniqueId_s | project StorageInGB, BackupItemUniqueId_s, StorageType_s, item_name, StorageUniqueId_s | where StorageType_s==\"Cloud\" | project StorageInGB, BackupItemFriendlyName=item_name, BackupItemUniqueId_s, StorageUniqueId_s | order by StorageInGB desc | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top 3 Vaults by Storage Consumed (GB)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Top 3 Vaults by Storage Consumed (GB)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"StorageAssociation\" |extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s, BackupItemUniqueId_s | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" \t| where SchemaVersion_s==\"V2\" | where OperationName == \"Storage\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageName_s=columnifexists(\"StorageName_s\",\"\") , StorageType_s = columnifexists(\"StorageType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s | project StorageUniqueId_s, StorageName_s ,BackupItemUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s==\"Cloud\" | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | summarize totalStorage=sum(StorageInGB) by StorageUniqueId_s, StorageName_s | project StorageName_s, totalStorage | sort by totalStorage desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"StorageAssociation\" |extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s, BackupItemUniqueId_s | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" \t| where SchemaVersion_s==\"V2\" | where OperationName == \"Storage\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageName_s=columnifexists(\"StorageName_s\",\"\") , StorageType_s = columnifexists(\"StorageType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s | project StorageUniqueId_s, StorageName_s ,BackupItemUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s==\"Cloud\" | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | summarize totalStorage=sum(StorageInGB) by StorageUniqueId_s, StorageName_s | project StorageName_s, totalStorage | sort by totalStorage desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Vault",
+ "Value": "Storage In GB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Storage\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageName_s = columnifexists(\"StorageName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageType_s = columnifexists(\"StorageType_s\",\"\") | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s | project StorageUniqueId_s, StorageName_s ,BackupItemUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s==\"Cloud\" | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Storage\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageName_s = columnifexists(\"StorageName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageType_s = columnifexists(\"StorageType_s\",\"\") | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s | project StorageUniqueId_s, StorageName_s ,BackupItemUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s==\"Cloud\" | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage by Storage Replication type (GB)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage by Storage Replication type (GB)"
+ },
+ "Donut": {
+ "Query": "let VaultIdRepMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Vault\" |extend StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\") |where StorageReplicationType_s != \"\" | summarize arg_max(TimeGenerated, *) by VaultUniqueId_s; let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let StorageAssociations=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\")| extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, VaultUniqueId_s, StorageUniqueId_s, TimeGenerated | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s, BackupItemUniqueId_s ; let Storages=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s = columnifexists(\"StorageType_s\",\"\")| summarize arg_max(TimeGenerated, *) by StorageUniqueId_s | project StorageUniqueId_s, StorageType_s | extend storage_type=StorageType_s ; StorageAssociations | join kind=inner( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | join kind= inner ( VaultIdRepMap ) on VaultUniqueId_s | join kind=leftouter ( Storages ) on StorageUniqueId_s | where storage_type==\"Cloud\" | summarize TotalCharge = sum(StorageInGB) by StorageReplicationType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let VaultIdRepMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Vault\" |extend StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\") |where StorageReplicationType_s != \"\" | summarize arg_max(TimeGenerated, *) by VaultUniqueId_s; let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let StorageAssociations=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\")| extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, VaultUniqueId_s, StorageUniqueId_s, TimeGenerated | summarize arg_max(TimeGenerated,*) by StorageUniqueId_s, BackupItemUniqueId_s ; let Storages=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s = columnifexists(\"StorageType_s\",\"\")| summarize arg_max(TimeGenerated, *) by StorageUniqueId_s | project StorageUniqueId_s, StorageType_s | extend storage_type=StorageType_s ; StorageAssociations | join kind=inner( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | join kind= inner ( VaultIdRepMap ) on VaultUniqueId_s | join kind=leftouter ( Storages ) on StorageUniqueId_s | where storage_type==\"Cloud\" | summarize TotalCharge = sum(StorageInGB) by StorageReplicationType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Replication Type",
+ "Value": "Storage (GB)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let VaultIdRepMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Vault\" | extend StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\") | where StorageReplicationType_s != \"\" | summarize arg_max(TimeGenerated, *) by VaultUniqueId_s; let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let StorageAssociations=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, VaultUniqueId_s, StorageUniqueId_s, TimeGenerated ; let Storages=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" |extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s = columnifexists(\"StorageType_s\",\"\"), StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\") | summarize arg_max(TimeGenerated, *) by StorageUniqueId_s | project StorageUniqueId_s, StorageType_s, StorageReplicationType_s | extend storage_type=StorageType_s; let Table1 = StorageAssociations | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | join kind=leftouter ( VaultIdRepMap ) on VaultUniqueId_s | join kind=leftouter ( Storages ) on StorageUniqueId_s | where storage_type==\"Cloud\" | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s, StorageReplicationType_s, bin(TimeGenerated, 1d); let Selection = Table1 | summarize TotalCharge = sum(StorageInGB) by StorageReplicationType_s | search {selected item}; Selection | join(Table1) on StorageReplicationType_s | project StorageReplicationType_s, VaultUniqueId_s, StorageInGB, BackupItemUniqueId_s",
+ "NavigationSelect": {
+ "NavigationQuery": "let VaultIdRepMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Vault\" | extend StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\") | where StorageReplicationType_s != \"\" | summarize arg_max(TimeGenerated, *) by VaultUniqueId_s; let BackupIdTypeMap = AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let StorageAssociations=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), VaultUniqueId_s = columnifexists(\"VaultUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, VaultUniqueId_s, StorageUniqueId_s, TimeGenerated ; let Storages=AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" |extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s = columnifexists(\"StorageType_s\",\"\"), StorageReplicationType_s = columnifexists(\"StorageReplicationType_s\",\"\") | summarize arg_max(TimeGenerated, *) by StorageUniqueId_s | project StorageUniqueId_s, StorageType_s, StorageReplicationType_s | extend storage_type=StorageType_s; let Table1 = StorageAssociations | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where ${DatasourceType} | join kind=leftouter ( VaultIdRepMap ) on VaultUniqueId_s | join kind=leftouter ( Storages ) on StorageUniqueId_s | where storage_type==\"Cloud\" | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s, StorageReplicationType_s, bin(TimeGenerated, 1d); let Selection = Table1 | summarize TotalCharge = sum(StorageInGB) by StorageReplicationType_s | search {selected item}; Selection | join(Table1) on StorageReplicationType_s | project StorageReplicationType_s, VaultUniqueId_s, StorageInGB, BackupItemUniqueId_s"
+ }
+ }
+ }
+ }
+ ],
+ "Filters": [
+ {
+ "FieldName": "BackupItemType_s",
+ "QueryForValues": "AzureDiagnostics | where Category == \"AzureBackupReport\"|distinct BackupItemType_s",
+ "Title": "DatasourceType"
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Tile": {
+ "Legend": "Total Cloud Storage Consumed (GB)",
+ "Query": " AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"StorageAssociation\" | extend StorageConsumedInMBs_s = columnifexists(\"StorageConsumedInMBs_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s=columnifexists(\"StorageType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\")| extend CloudStorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project CloudStorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\" | where OperationName == \"Storage\" | extend StorageUniqueId_s = columnifexists(\"StorageUniqueId_s\",\"\"), StorageType_s=columnifexists(\"StorageType_s\",\"\")|distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s == \"Cloud\" | summarize arg_max(TimeGenerated, *) by StorageUniqueId_s,BackupItemUniqueId_s | summarize sum(CloudStorageInGB)"
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT65 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT65
new file mode 100644
index 0000000..d2c6875
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT65
@@ -0,0 +1,572 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-chefnodes.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884558,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-chefnodes.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT65",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT65",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "network-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "compute-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "deployment-api-version2": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "adminUsernameChefWorkstation": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "adminPasswordChefWorkstation": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "publicIPDomainNameLabelChefWorkstation": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publicIPDomainNameLabelDSAgentWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "adminUsernameDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publicIPDomainNameLabelDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "linuxvmcount": {
+ "type": "int",
+ "defaultValue": ""
+ },
+ "windowsvmcount": {
+ "type": "int",
+ "defaultValue": ""
+ },
+ "ManagerAddress": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet4Ref": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmNameChefWorkstation": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmSizeChefWorkstation": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmNameDSAWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmSizeDSAWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmNameDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmSizeDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imagePublisherWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imageOfferWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imagePublisherLinux": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imageOfferLinux": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmStorageAccountContainerName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ActivationPort": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "TenantIdentifier": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "TenantActivationPassword": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "adminUsernameDSAgentWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "adminPasswordDSAgentWindows": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "tagvalues": {
+ "type": "object",
+ "defaultValue": ""
+ },
+ "chefprefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "keyName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "kmServerUrl": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chef_node_name": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chef_server_url": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "validation_client_name": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "validation_key_format": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "runlist": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "resourcegroupName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefnodeCustomScripturl": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "baseUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Base public URL for the script. Most likely this will be your Github, Azure Blob or Dropbox URL"
+ }
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "adminPasswordOrPublicKeyDSAgent": {
+ "type": "securestring"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {
+ "publicIPAddressNameChefWorkstation": "publicIPChefWorkstation",
+ "networkInterfaceNameChefWorkstation": "parameters('vmNameChefWorkstation')-nic",
+ "securityGroupNameChefWorkstation": "parameters('vmNameChefWorkstation')-nic-nsg",
+ "publicIPAddressNameDSAWindows": "publicipdsawindows",
+ "networkInterfaceNameDSAWindows": "parameters('vmNameDSAWindows')-nic",
+ "securityGroupNameDSAWindows": "parameters('vmNameDSAWindows')-nic-nsg",
+ "publicIPAddressNameDSAgent": "publicipdsalinux",
+ "networkInterfaceNameDSAgent": "parameters('vmNameDSAgent')-nic",
+ "securityGroupNameDSAgent": "parameters('vmNameDSAgent')-nic-nsg",
+ "vmExtensionName": "ChefnodeExtension",
+ "vmExtensionName2": "ChefCustomScript",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/ parameters('adminUsernameDSAgent')/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrPublicKeyDSAgent"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "parameters('chefprefix')publicIPChefWorkstation",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "parameters('chefprefix')parameters('publicIPDomainNameLabelChefWorkstation')"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "parameters('chefprefix')parameters('vmNameChefWorkstation')-nic",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/parameters('chefprefix')publicIPChefWorkstation"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/parameters('chefprefix')publicIPChefWorkstation"
+ },
+ "subnet": {
+ "id": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "parameters('chefprefix')parameters('vmNameChefWorkstation')",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/ parameters('chefprefix')parameters('vmNameChefWorkstation')-nic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": ""
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "adminPassword": ""
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "",
+ "offer": "",
+ "sku": "",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "parameters('chefprefix')parameters('vmNameChefWorkstation')-osDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/parameters('chefprefix')parameters('vmNameChefWorkstation')-nic"
+ }
+ ]
+ }
+ },
+ "resources": []
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "parameters('chefprefix')publicipdsalinuxcopyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "parameters('chefprefix')parameters('publicIPDomainNameLabelDSAgent')copyindex()"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "parameters('chefprefix')parameters('vmNameDSAgent')-niccopyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/ parameters('chefprefix')publicipdsalinuxcopyindex()"
+ ],
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/parameters('chefprefix')publicipdsalinuxcopyindex()"
+ },
+ "subnet": {
+ "id": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "parameters('chefprefix')parameters('vmNameDSAgent')copyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/ parameters('chefprefix')parameters('vmNameDSAgent')-niccopyindex()"
+ ],
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": ""
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "adminPassword": "adminPasswordOrPublicKeyDSAgent",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "",
+ "offer": "",
+ "sku": "",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "parameters('chefprefix')parameters('vmNameDSAgent')copyindex()-osDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/parameters('chefprefix')parameters('vmNameDSAgent')-niccopyindex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('chefprefix')parameters('vmNameDSAgent')copyIndex()/ChefnodeExtension",
+ "apiVersion": "2015-05-01-preview",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('chefprefix')parameters('vmNameDSAgent')copyindex()"
+ ],
+ "properties": {
+ "publisher": "Chef.Bootstrap.WindowsAzure",
+ "type": "LinuxChefClient",
+ "typeHandlerVersion": "1210.12",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "bootstrap_options": {
+ "chef_node_name": "parameters('chef_node_name')copyIndex()",
+ "chef_server_url": "",
+ "validation_client_name": ""
+ },
+ "validation_key_format": "",
+ "runlist": "",
+ "client_rb": "ssl_verify_mode :verify_none"
+ },
+ "protectedSettings": {
+ "validation_key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMnpwOTRCd0FvanRzbzF0R3hVekJySUNPWHd1Y09RWUhKWm54QnFBRnlGWTVNZ3hPClEvZWZPOGtFd2ZMNmVVaWYyQVJpd1FNb0xwSHQyd1Rsanp1SG9NZFduREpqanFuRWVHN2lFT2pSOExPOUxMWUUKVW1DVWthVFN0aDVCbUs3SEFOZExhUnRhWE1FU3ljem9QNFA2WEpaRXArVzZZOWkrRTRrcjcxajVOOXVCSVZzbwpGVTc3RDMrZnQ3THdFVHU3blBXWkl1OUMyUlZMb2d4b2lnSWdlUmNsSmlKaFdWaWR5OHNaaHMwMkJkY3pKUlJFClpQSmJIUld6dCtGN2RJdWVQSW81aW5LdEhNeE5Vay90bnY0U3RnS0l5RzBuc01IUWNJNmNPbDE0Lzh4Mjl1OTgKdTA1a1FwRHljWWxodWRBVXBZOGF6blNhZTV2Z2lxUGxQNU0rWFFJREFRQUJBb0lCQUg2QllFWEVvdkQ3RFpPdQpoa1l3SnNxZVhJbW9MM3dRYUd0Z1M5K2cwL1ZwSEJRdldiS0szODRtRDZMRHpablRPTG4wdmUvWEhJYlRHc2g2CktPWGdXa0dEQmcyWVhpN2k5RWJ5NVcwUWpLVXpjd1NyL0E1MVFRWlNjRzA3UkdzUTRERXlDNGdaaXFsZm1MSHUKbGs2Z29BWnhpQ2pDdmk0RDBwdC9XbVVCbUw2TDBLTXlwbThiM0ZkVFdPeENFWE1KZTZXeHdxSUZxejRyWFpxSwpyWkxmdDc5c3Y2ZzdQMUsraVFVcGxaaHd6SEJtUjVQS283enZBS29UQ0hBeUVpRHZyM0ZySTNhVThLRktaalg0CjBvdFlKVERpNHh6TWJMcWVoT2V5SFZNNEJlRnFTOHZGYjF2ZkVVSU44emRLdS9WNGJveWI3VDRjY3AzQmVlOWEKUGQ1TXVKa0NnWUVBOE5uc3dPVVFuR0t4WUN3YlgwWGUydHByNkFKK2djYmNJempJaHIxM1UrKzlGbXc2c01nZgpNMk9IekFZOTMveU8yMi84Z0l4TFA3TVpGbHRFNzdhQkpSL0xCZTBMRXVOYU50Ri94cENoRktkTHlWSHdkUGtBCmpMY0pmRmQ3TXhpejk4d3Y2cnhSZDRMOU5WaXZVakwwYytOYmpUNVVpQWNsNmxGeFRrSUhZaU1DZ1lFQTZRUm8KSnBrSG95VVZnMnFsWjJuRlVyU3FOWS9qTnIvSWR2WmNuYnIxM3ZmZ2dGVzZOQW83aXZTNGxQVlhMNVFuNndHTwpsUkxXR2g3ZEVRTlpPdWtZUFR6SjVCNVh4LzhnMVVJdFI5VHRtM242cE1SWnJWbDIxVHc5dXA5aW5HQ0krdXdWCmJJb2x5anNtQ25tU1JWckdHZ0NxT0J1SW1SOExyRVUzK0VuRHBYOENnWUFPN1pMdENjV1R5OUl1b2MwNGhINGgKbG5RbHR6SGNIVlU3b2FOY0pwWWt6N0VxbUo2eW9sUzh2S2lJRHNMN0JRNWRyMzA1QW5rUGc2eEVaSGZMVzhaNQpaSlVTMHZSaXdWQ3dJU0FJVUtLTFF5dEJXU0RNUHpxM2ZnaktlaW1hcXlkTWJvMXh3U1pUZi96dHQ0ZDJVczR2CitLR09DWlQzc1dtNk1qNFJtYW9YZlFLQmdRQ2VTM0VaYjNJQndZcUkyU1QrU0p0VTRRaVVGR2h0WkFHaDF5RDUKd2UyUGgrTEtLL0t2c1pmYmdQMzNxMmVNR2VDNFJEbUJTZWVLblJiZW5PQzhKV2RqQ20yNGUyaDBvL3ZCQkJEUQpzSFN0MzBLSE5pQVpwQ0lYSDdKcm1pVWFTSFlseDhXU0U1TXllOVlPM2FHaFhkWWdDZjJZMmhPRXVkTnJOeWFiCmxEakZyd0tCZ1FDRDh5TTZiTCswMU5CekkzT2JPZXROYU5BeGVkeC96TElVTGNnRW1tK0JZR2QrTFNCVnNDVEUKanIxN0ZxZEVhVXNOL1E1ZEVsQ0pHbVowUVR5MkFWQThodUk0YmtEQ21LRGM1VnMyTCs5RXpyUkdqOU1xbGs4SQoxeFhwWGVUdHAybFZ2YkRsN0VZYklkazREa3NJZVRYeXhKS0dNWkRjQ1UxekJRMTNpMmNTUWc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ=="
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('chefprefix')parameters('vmNameDSAgent')copyIndex()/ChefCustomScript",
+ "apiVersion": "2015-05-01-preview",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('chefprefix')parameters('vmNameDSAgent')copyindex()",
+ "Microsoft.Compute/virtualMachines/ parameters('chefprefix')parameters('vmNameDSAgent')copyindex()/extensions/ChefnodeExtension"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ ""
+ ],
+ "commandToExecute": "sh p2pchefnodebootstrap.sh parameters('keyName') parameters('kmServerUrl')"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT650 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT650
new file mode 100644
index 0000000..1e32053
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT650
@@ -0,0 +1,488 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/nested/on_prem_alerts.json"
+ ],
+ "timestamp": 1642962898637,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/nested/on_prem_alerts.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT650",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/views"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT650",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "workspaceName/on_prem_alerts",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "properties": {
+ "Name": "Alerts from On-Premises Resources Backup",
+ "Author": "Microsoft",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts by Alert Type",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Alerts by Alert Type",
+ "Subtitle": "Filter by Datasource Type by Clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Alert Type",
+ "Value": "No of Alerts"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertType_s=columnifexists(\"AlertType_s\", \"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_g\", \"AlertUniqueId_s\" ) | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi ( Selection ) on AlertType_s | project AlertUniqueId, AlertType_s, TimeGenerated, AlertStatus_s, BackupItemUniqueId_s",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertType_s=columnifexists(\"AlertType_s\", \"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_g\", \"AlertUniqueId_s\" ) | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertType_s | sort by count_ desc | search {selected item}; Alerts | join kind=leftsemi ( Selection ) on AlertType_s | project AlertUniqueId, AlertType_s, TimeGenerated, AlertStatus_s, BackupItemUniqueId_s"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts Created vs Alerts Resolved",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Trend1": {
+ "Legend": "Alerts Created",
+ "LegendColor": "#00188f",
+ "ChartQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\") , BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists (\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") |where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_min(TimeGenerated, *) by AlertUniqueId; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(AlertUniqueId) by bin(TimeGenerated,1h)",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "Trend2": {
+ "Legend": "Alerts Resolved",
+ "LegendColor": "#0072c6",
+ "ChartQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\") , AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_g\",\"AlertUniqueId_s\")| where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_g; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where AlertStatus_s==\"Resolved\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(AlertUniqueId) by bin(TimeGenerated,1h)",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s=columnifexists(\"AlertStatus_s\", \"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\"); Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by AlertUniqueId | extend CurrentStatus = AlertStatus_s | join kind=leftouter ( Alerts | summarize arg_max(TimeGenerated, *) by TimeGenerated, AlertUniqueId | summarize HitCount = count() by AlertUniqueId ) on AlertUniqueId | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"\") | where ${DatasourceType} | project AlertUniqueId , AlertStatus_s, AlertType_s, HitCount | sort by AlertStatus_s asc, HitCount desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Alert Unique ID",
+ "Value": "Hit Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\")| where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\"); let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertUniqueId != \"\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend CurrentStatus = AlertStatus_s | join kind=leftouter ( Alerts | summarize arg_max(TimeGenerated,*) by TimeGenerated, AlertUniqueId | summarize HitCount = count() by AlertUniqueId ) on AlertUniqueId | where AlertUniqueId !=\"\" | project AlertUniqueId , AlertStatus_s, AlertCode_s, AlertType_s, HitCount | sort by AlertStatus_s asc, HitCount desc | search {selected item}; Alerts | join kind=inner(Selection) on AlertUniqueId | summarize arg_max(TimeGenerated, *) by AlertUniqueId |project TimeGenerated, AlertUniqueId, BackupItemUniqueId_s, AlertType_s, AlertCode_s, AlertStatus_s, HitCount",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), AlertType_s=columnifexists(\"AlertType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\")| where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\"); let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertUniqueId != \"\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend CurrentStatus = AlertStatus_s | join kind=leftouter ( Alerts | summarize arg_max(TimeGenerated,*) by TimeGenerated, AlertUniqueId | summarize HitCount = count() by AlertUniqueId ) on AlertUniqueId | where AlertUniqueId !=\"\" | project AlertUniqueId , AlertStatus_s, AlertCode_s, AlertType_s, HitCount | sort by AlertStatus_s asc, HitCount desc | search {selected item}; Alerts | join kind=inner(Selection) on AlertUniqueId | summarize arg_max(TimeGenerated, *) by AlertUniqueId |project TimeGenerated, AlertUniqueId, BackupItemUniqueId_s, AlertType_s, AlertCode_s, AlertStatus_s, HitCount"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Active Alerts by Severity",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Alerts by Severity",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\", \"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_g | where AlertUniqueId_g != \"\"; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where AlertStatus_s==\"Active\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Critical",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "Warning",
+ "color": "#ff8c00"
+ },
+ {
+ "value": "Information",
+ "color": "#fff100"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\", \"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_g | where AlertUniqueId_g != \"\"; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where AlertStatus_s==\"Active\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Alert Severity",
+ "Value": "No of Alerts"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\", \"\"), TimeGenerated=columnifexists(\"TimeGenerated\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\") , AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") |where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertUniqueId_g != \"\" | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item} ; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s | where AlertStatus_s==\"Active\"| project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, Alert_TimeGenerated ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\", \"\"), TimeGenerated=columnifexists(\"TimeGenerated\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\") , AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") |where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertUniqueId_g != \"\" | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item} ; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s | where AlertStatus_s==\"Active\"| project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, Alert_TimeGenerated "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Resolved Alerts by Severity",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Resolved Alerts by Severity",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\", \"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_g | where AlertUniqueId_g != \"\"; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where AlertStatus_s==\"Resolved\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\", \"\") , AlertStatus_s=columnifexists(\"AlertStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | extend AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId_g | where AlertUniqueId_g != \"\"; Alerts | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where AlertStatus_s==\"Resolved\" | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count() by AlertSeverity_s | sort by count_ desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Alert Severity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\", \"\"), TimeGenerated=columnifexists(\"TimeGenerated\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\") , AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") |where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertUniqueId_g != \"\" | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item} ; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s | where AlertStatus_s==\"Resolved\"| project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, Alert_TimeGenerated ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\", \"\"), TimeGenerated=columnifexists(\"TimeGenerated\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts=Events | where OperationName == \"Alert\" | extend BackupManagementType_s=columnifexists(\"BackupManagementType_s\",\"\") , AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s = columnifexists(\"AlertUniqueId_s\",\"\"), AlertSeverity_s=columnifexists(\"AlertSeverity_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), AlertCode_s=columnifexists(\"AlertCode_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\", \"AlertUniqueId_s\") |where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId; let Selection = Alerts | join kind=leftouter ( BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where AlertUniqueId_g != \"\" | where AlertStatus_s==\"Active\" | summarize count() by AlertSeverity_s | sort by count_ desc | search {selected item} ; Alerts | join kind=leftsemi(Selection) on AlertSeverity_s | where AlertStatus_s==\"Resolved\"| project AlertUniqueId, AlertSeverity_s, BackupItemUniqueId_s, AlertCode_s, AlertStatus_s, Alert_TimeGenerated "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Avg Alert Resolution Time per week (hrs)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Avg Alert Resolution Time per week (hrs)",
+ "Subtitle": "Stretch the time axis to see the trend (above time filter)"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts= Alerts |summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds= Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | summarize avg(timeToResolveInHrs) by bin(Alert_TimeGenerated,7d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts= Alerts |summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds= Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | summarize avg(timeToResolveInHrs) by bin(Alert_TimeGenerated,7d)",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Week Start",
+ "Value": "Average resolution Time (hrs)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts= Alerts |summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds= Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | summarize avg(timeToResolveInHrs) by bin(Alert_TimeGenerated,7d)",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")|where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts = Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists(\"AlertUniqueId_g\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\"), Alert_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts= Alerts |summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds= Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); Table1 | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} | summarize avg(timeToResolveInHrs) by bin(Alert_TimeGenerated,7d)"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top 3 backup Items by Avg Alert Resolution time",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Breakup by Avg Alert Resolution time (hrs)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId = columnifexists (\"AlertUniqueId_g\", \"AlertUniqueId_s\")|where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s2\",\"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend AlertUniqueId = columnifexists (\"AlertUniqueId_g\", \"AlertUniqueId_s\")|where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s2\",\"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Avg Resolution Time (hrs)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId = columnifexists (\"AlertUniqueId_g\", \"AlertUniqueId_s\")|where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName = columnifexists (\"BackupItemFriendlyName_s2\", \"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\", \"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\", \"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Alerts= Events | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_g = columnifexists (\"AlertUniqueId_g\", \"\"), AlertUniqueId_s = columnifexists (\"AlertUniqueId_s\",\"\"), Alert_TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\", \"\") , BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| extend AlertUniqueId = columnifexists (\"AlertUniqueId_g\", \"AlertUniqueId_s\")|where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") ; let AlertStarts=Alerts | summarize arg_min(Alert_TimeGenerated, *) by AlertUniqueId | extend startTime=Alert_TimeGenerated; let AlertEnds=Alerts | summarize arg_max(Alert_TimeGenerated, *) by AlertUniqueId | where AlertStatus_s==\"Resolved\" | extend endTime=Alert_TimeGenerated; let Table1 = AlertStarts | join kind=inner ( AlertEnds ) on AlertUniqueId | extend timeToResolveInHrs=datetime_diff(\"hour\",endTime,startTime); let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s2\",\"BackupItemType_s\") | where ${DatasourceType} ; Table2 | extend BackupItemFriendlyName = columnifexists (\"BackupItemFriendlyName_s2\", \"BackupItemFriendlyName_s\") | summarize avg(timeToResolveInHrs) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by avg_timeToResolveInHrs desc | search {selected item}"
+ }
+ }
+ }
+ }
+ ],
+ "Filters": [
+ {
+ "FieldName": "BackupItemType_s",
+ "QueryForValues": "AzureDiagnostics | where Category == \"AzureBackupReport\" | distinct BackupItemType_s",
+ "Title": "DatasourceType"
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "TileOne": {
+ "Legend": "Alerts Created in Period",
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\"| where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId |count "
+ },
+ "TileTwo": {
+ "Legend": "Active Alerts Created in Period",
+ "Query": " AzureDiagnostics | where Category == \"AzureBackupReport\"| where SchemaVersion_s==\"V2\" | where OperationName == \"Alert\" | extend BackupManagementType_s = columnifexists(\"BackupManagementType_s\",\"\"), AlertUniqueId_s=columnifexists(\"AlertUniqueId_s\",\"\"), AlertUniqueId_g=columnifexists(\"AlertUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), AlertStatus_s = columnifexists(\"AlertStatus_s\",\"\") | extend AlertUniqueId=columnifexists(\"AlertUniqueId_g\",\"AlertUniqueId_s\") | where BackupManagementType_s in~(\"MAB\",\"DPM\",\"AzureBackupServer\") | summarize arg_max(TimeGenerated, *) by AlertUniqueId | where AlertStatus_s == \"Active\" |count "
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT651 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT651
new file mode 100644
index 0000000..7fa0e34
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT651
@@ -0,0 +1,628 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/nested/restore_jobs.json"
+ ],
+ "timestamp": 1642962898646,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/nested/restore_jobs.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT651",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/views"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT651",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "workspaceName/restore_jobs",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "properties": {
+ "Name": "Restore Jobs",
+ "Author": "Microsoft",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Status",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Status",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": " let Events= AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"); let Jobs = Events | where OperationName == \"Job\" |extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"); Jobs | extend TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\", \"Recovery\") | join kind=leftouter ( BackupItems ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc ",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "CompletedWithWarnings",
+ "color": "#ffb900"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName ==\"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"); let BackupItems = Events | where OperationName ==\"BackupItem\" | extend BackupItemType_s= columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\",\"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s ) on BackupItemUniqueId_s| where ${DatasourceType} | project BackupItemFriendlyName_s, BackupItemUniqueId_s, JobStatus_s, Vault=Resource | summarize count() by BackupItemUniqueId_s , BackupItemFriendlyName_s, JobStatus_s, Vault | order by count_ desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events=AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"); let BackupItems = Events | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\" , \"\"); let ProtectedContainers = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists (\"ProtectedContainerUniqueId_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\",\"Recovery\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( ProtectedContainers | summarize arg_max(TimeGenerated,*) by ProtectedContainerUniqueId_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Vault=Resource, JobFailureCode_s | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events=AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s=columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"); let BackupItems = Events | where OperationName == \"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\" , \"\"); let ProtectedContainers = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists (\"ProtectedContainerUniqueId_s\",\"\"); Jobs | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\"), Resource = columnifexists(\"Resource\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\",\"Recovery\") | summarize arg_max(TimeGenerated,*) by JobUniqueId_g | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( BackupItems | summarize arg_max(TimeGenerated,*) by BackupItemUniqueId_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( ProtectedContainers | summarize arg_max(TimeGenerated,*) by ProtectedContainerUniqueId_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Vault=Resource, JobFailureCode_s | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top 3 Backup Items by Job Duration",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Job Duration (Hrs)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" ; let BackupIdNameMap = BackupItems | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName == \"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s= columnifexists (\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\",\"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s | sort by totalDurationInHrs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") |where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\") | where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Total Job Duration (hrs)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName ==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobDurationInSecs_s = columnifexists (\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobStatus_s, JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; let Selection = Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc | search {selected item} | join ( BackupIdNameMap ) on BackupItemFriendlyName_s; Selection | join(Jobs) on BackupItemUniqueId_s ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists (\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemType_s, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let ContainerIdNameMap = Events | where OperationName ==\"ProtectedContainer\" | extend ProtectedContainerFriendlyName_s = columnifexists(\"ProtectedContainerFriendlyName_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") |where ProtectedContainerFriendlyName_s != \"\" | project TimeGenerated, ProtectedContainerFriendlyName_s , ProtectedContainerUniqueId_s | summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobDurationInSecs_s = columnifexists (\"JobDurationInSecs_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | project BackupItemUniqueId_s, JobUniqueId_g , JobStatus_s, JobDurationInSecs_s, ProtectedContainerUniqueId_s; let Table1 = Jobs | join kind=leftouter ( ContainerIdNameMap ) on ProtectedContainerUniqueId_s; let Table2 = Table1 | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s; let Selection = Table2 | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where BackupItemFriendlyName_s !=\"\" | summarize totalDurationInHrs = round(sum(todouble(JobDurationInSecs_s)/3600),2) by BackupItemUniqueId_s, BackupItemFriendlyName_s | sort by totalDurationInHrs desc | search {selected item} | join ( BackupIdNameMap ) on BackupItemFriendlyName_s; Selection | join(Jobs) on BackupItemUniqueId_s "
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Total Data Transferred",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Total Data Transferred (MB)",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" ; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists (\"JobUniqueId_g\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\", \"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\")| where JobOperation_s !in~(\"Restore\", \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\", \"BackupItemType_s\") | where ${DatasourceType} | summarize sum(todouble(DataTransferredInMB_s)) by bin(TimeGenerated, 1d), JobOperation_s",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\") , TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\", \"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "Total Data Transferred (MB)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\", \"\") , JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\",\"\") | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\", \"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithTotalDataTransferred = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s in~(\"Restore\",\"Recovery\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc | search {selected item}; JobsWithTotalDataTransferred | join(Jobs| where JobOperation_s in~(\"Restore\",\"Recovery\")) on BackupItemUniqueId_s | project JobUniqueId_g, TimeGenerated, DataTransferredInMB_s, JobStatus_s, ProtectedContainerUniqueId_s, BackupItemUniqueId_s, BackupItemFriendlyName, JobOperation_s",
+ "NavigationSelect": {
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\", \"\") , JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), DataTransferredInMB_s = columnifexists(\"DataTransferredInMB_s\",\"\") | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\", \"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s, BackupItemFriendlyName_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithTotalDataTransferred = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s in~(\"Restore\",\"Recovery\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\") | where ${DatasourceType} | summarize totalDataTransferred=sum(todouble(DataTransferredInMB_s)) by BackupItemUniqueId_s, BackupItemFriendlyName | sort by totalDataTransferred desc | search {selected item}; JobsWithTotalDataTransferred | join(Jobs| where JobOperation_s in~(\"Restore\",\"Recovery\")) on BackupItemUniqueId_s | project JobUniqueId_g, TimeGenerated, DataTransferredInMB_s, JobStatus_s, ProtectedContainerUniqueId_s, BackupItemUniqueId_s, BackupItemFriendlyName, JobOperation_s"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed Restore Job Count per day",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Failed Restore Job Count per day",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Failed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend JobDate = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, JobDate, timeOfJob | project timeOfJob, BackupItemFriendlyName, JobDate, FailedBackupJobCount=count_JobUniqueId_g | sort by JobDate asc | summarize sum(toint(FailedBackupJobCount)) by bin(timeOfJob, 1d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\") , BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend JobStatus_s = columnifexists(\"JobStatus_s\", \"\"),BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists (\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Failed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemFriendlyName, BackupItemUniqueId_s, Job_Date | project BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, FailedBackupJobCount=count_JobUniqueId_g | sort by Job_Date asc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item Id",
+ "Value": "#Failed Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") | where ${DatasourceType}; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s in~(\"Restore\",\"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let BackupIdNameMap = BackupItems |extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s, BackupItemType_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob | project BackupItemUniqueId_s,BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob| sort by Job_Date desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\") | where ${DatasourceType}; let Jobs = Events| where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists (\"JobOperation_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s in~(\"Restore\",\"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let BackupIdNameMap = BackupItems |extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s, BackupItemType_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let FailedBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; FailedBackupJobs | extend Job_Date = format_datetime(timeOfJob, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob | project BackupItemUniqueId_s,BackupItemFriendlyName, Job_Date, ProtectedContainerUniqueId_s, timeOfJob| sort by Job_Date desc | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Successful Restore Job Count Per day",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Successful Restore Job Count Per day",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "LineChart": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project TimeGenerated, BackupItemFriendlyName_s, BackupItemType_s, BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} ; SuccessfulBackupJobs | extend JobDate = format_datetime(TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, JobDate, timeOfJob | project timeOfJob, BackupItemFriendlyName, JobDate, SuccessfulBackupJobCount=count_JobUniqueId_g | sort by JobDate asc | summarize sum(SuccessfulBackupJobCount) by bin(timeOfJob, 1d)",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\") | where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap | extend BackupItemFriendlyName=BackupItemFriendlyName_s ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count(JobUniqueId_g) by BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date | project BackupItemUniqueId_s, BackupItemFriendlyName, Job_Date, SuccessfulBackupJobCount=count_JobUniqueId_g | sort by Job_Date desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Backup Item ID",
+ "Value": "#Successful Backup Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count() by BackupItemUniqueId_s, BackupItemFriendlyName=columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\"), Job_Date, timeOfJob, JobUniqueId_g, JobStatus_s, ProtectedContainerUniqueId_s | sort by Job_Date desc | search {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": " let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"); let BackupIdNameMap = BackupItems | extend BackupItemFriendlyName_s = columnifexists(\"BackupItemFriendlyName_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemFriendlyName_s != \"\" | project BackupItem_TimeGenerated, BackupItemFriendlyName_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\", \"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\", \"\"), ProtectedContainerUniqueId_s = columnifexists(\"ProtectedContainerUniqueId_s\",\"\")| where JobStatus_s == \"Completed\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | extend timeOfJob = Job_TimeGenerated; let SuccessfulBackupJobs = Jobs | join kind=leftouter ( BackupIdNameMap ) on BackupItemUniqueId_s | where ${DatasourceType}; SuccessfulBackupJobs | extend Job_Date = format_datetime(Job_TimeGenerated, \"MM/dd/yy\") | summarize count() by BackupItemUniqueId_s, BackupItemFriendlyName=columnifexists(\"BackupItemFriendlyName_s1\",\"BackupItemFriendlyName_s\"), Job_Date, timeOfJob, JobUniqueId_g, JobStatus_s, ProtectedContainerUniqueId_s | sort by Job_Date desc | search {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed jobs by Failure Code",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Failed jobs by Failure Code",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists (\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s in~(\"Restore\",\"Recovery\") | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by JobFailureCode_s | sort by count_JobUniqueId_g desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists (\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs= Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s in~(\"Restore\",\"Recovery\") | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by JobFailureCode_s | sort by count_JobUniqueId_g desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Failure Code",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs=Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s in~(\"Restore\" ,\"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists (\"BackupItemType_s\",\"\"), TimeGenerated =columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs=Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobStatus_s = columnifexists(\"JobStatus_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobFailureCode_s = columnifexists(\"JobFailureCode_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobStatus_s == \"Failed\" | where JobOperation_s in~(\"Restore\" ,\"Recovery\") | summarize arg_max(TimeGenerated, *) by JobUniqueId_g | where JobUniqueId_g!=\"\"; Jobs | join kind=leftouter (BackupIdTypeMap) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Creation Time",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Creation Time",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | where JobOperation_s in~(\"Restore\" , \"Recovery\") ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3) | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | project timeBucketStart24, timeBucketStart12 , timeBucketEnd12 , timeBucketStartMeridian , timeBucketEndMeridian , count_JobUniqueId_g | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | summarize noOfJobs=sum(count_JobUniqueId_g) by timeBucketString | sort by noOfJobs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s= columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g | where JobOperation_s in~(\"Restore\" , \"Recovery\") ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3) | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | project timeBucketStart24, timeBucketStart12 , timeBucketEnd12 , timeBucketStartMeridian , timeBucketEndMeridian , count_JobUniqueId_g | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | summarize noOfJobs=sum(count_JobUniqueId_g) by timeBucketString | sort by noOfJobs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Time of Day",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName == \"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated= columnifexists(\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s=columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | where JobOperation_s in~(\"Restore\" ,\"Recovery\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g; let JobsWithTimeBucket = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | sort by count_JobUniqueId_g desc; let Selection=JobsWithTimeBucket | search {selected item}; Selection | join( JobsWithTimeBucket) on timeBucketString | project TimeOfDay=timeBucketString, JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName == \"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\", \"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName==\"Job\" | extend BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") , JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), Job_TimeGenerated= columnifexists(\"TimeGenerated\",\"\"), ProtectedContainerUniqueId_s=columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\")| extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobUniqueId_g!=\"\" | where JobOperation_s in~(\"Restore\" ,\"Recovery\") | summarize arg_max(Job_TimeGenerated, *) by JobUniqueId_g; let JobsWithTimeBucket = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | extend timeOfDay=datetime_part(\"Hour\",Job_TimeGenerated) | summarize count(JobUniqueId_g) by bin(timeOfDay,3), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend timeBucketStart24 = iff(timeOfDay-1.5>0,timeOfDay-1.5,timeOfDay-1.5+24), timeBucketEnd24=iff(timeOfDay+1.5<24,timeOfDay+1.5,timeOfDay+1.5-24) | extend timeBucketStart12=iff(timeBucketStart24>12,timeBucketStart24-12, timeBucketStart24) , timeBucketStartMeridian = iff(timeBucketStart24<12,\"AM\", iff(timeBucketStart24<24,\"PM\",\"AM\")), timeBucketEnd12=iff(timeBucketEnd24>12,timeBucketEnd24-12, timeBucketEnd24) , timeBucketEndMeridian = iff(timeBucketEnd24<12,\"AM\", iff(timeBucketEnd24<24,\"PM\",\"AM\")) | extend timeBucketStartHr=toint(timeBucketStart12), timeBucketStartMin=toint((timeBucketStart12-floor(timeBucketStart12,1))*60), timeBucketEndHr=toint(timeBucketEnd12), timeBucketEndMin=toint((timeBucketEnd12-floor(timeBucketEnd12,1))*60) | extend timeBucketStartMinString=iff(timeBucketStartMin>9,tostring(timeBucketStartMin),iff(timeBucketStartMin>0,strcat(\"0\",timeBucketStartMin), \"00\")), timeBucketEndMinString=iff(timeBucketEndMin>9,tostring(timeBucketEndMin),iff(timeBucketEndMin>0,strcat(\"0\",timeBucketEndMin), \"00\")) | extend timeBucketString = strcat(tostring(timeBucketStartHr),\":\",timeBucketStartMinString,timeBucketStartMeridian, \"-\",tostring(timeBucketEndHr), \":\", timeBucketEndMinString,timeBucketEndMeridian) | sort by count_JobUniqueId_g desc; let Selection=JobsWithTimeBucket | search {selected item}; Selection | join( JobsWithTimeBucket) on timeBucketString | project TimeOfDay=timeBucketString, JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s"
+ }
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Jobs by Job Duration",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs by Job Duration",
+ "Subtitle": "Filter by Datasource Type by clicking the (+) above"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\", \"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") |summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600) | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | summarize noOfJobs= sum(count_JobUniqueId_g) by JobDurationString | sort by noOfJobs desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let BackupIdTypeMap = BackupItems | extend BackupItemType_s = columnifexists(\"BackupItemType_s\",\"\"), BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\")| where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let Jobs = Events | where OperationName == \"Job\" | extend BackupItemUniqueId_s = columnifexists (\"BackupItemUniqueId_s\",\"\"), JobOperation_s = columnifexists(\"JobOperation_s\",\"\") , Job_TimeGenerated = columnifexists(\"TimeGenerated\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\", \"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s in~(\"Restore\" , \"Recovery\") |summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g ; Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600) | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | summarize noOfJobs= sum(count_JobUniqueId_g) by JobDurationString | sort by noOfJobs desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Job Duration",
+ "Value": "No of Jobs"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\"), ProtectedContainerUniqueId_s =columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s=columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g; let BackupIdTypeMap = BackupItems |extend BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithDurationString = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s in~(\"Restore\" ,\"Recovery\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | sort by count_JobUniqueId_g desc; let Selection = JobsWithDurationString | search {selected item}; Selection | join ( JobsWithDurationString ) on JobDurationString | project JobDurationString,JobUniqueId_g, JobStatus_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s ",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; let BackupItems = Events | where OperationName==\"BackupItem\"; let Jobs = Events | where OperationName == \"Job\" | extend JobOperation_s = columnifexists(\"JobOperation_s\",\"\"), Job_TimeGenerated = columnifexists(\"TimeGenerated\", \"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobDurationInSecs_s = columnifexists(\"JobDurationInSecs_s\",\"\"), ProtectedContainerUniqueId_s =columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), JobStatus_s=columnifexists(\"JobStatus_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | summarize arg_max(Job_TimeGenerated,*) by JobUniqueId_g; let BackupIdTypeMap = BackupItems |extend BackupItem_TimeGenerated=columnifexists(\"TimeGenerated\",\"\"), BackupItemType_s=columnifexists(\"BackupItemType_s\",\"\"), BackupItemUniqueId_s = columnifexists(\"BackupItemUniqueId_s\",\"\") | where BackupItemType_s != \"\" | project BackupItem_TimeGenerated, BackupItemType_s , BackupItemUniqueId_s | summarize arg_max(BackupItem_TimeGenerated, *) by BackupItemUniqueId_s; let JobsWithDurationString = Jobs | join kind=leftouter ( BackupIdTypeMap ) on BackupItemUniqueId_s | where JobOperation_s in~(\"Restore\" ,\"Recovery\") | extend BackupItemType_s=columnifexists(\"BackupItemType_s1\",\"BackupItemType_s\") | where ${DatasourceType} | summarize count(JobUniqueId_g) by bin(todouble(JobDurationInSecs_s), 600), JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s | extend JobDurationInMin = todouble(JobDurationInSecs_s) / 60 | extend JobDurationLowerLimit=iff(JobDurationInMin>5,JobDurationInMin - 5,todouble(0)), JobDurationUpperLimit = JobDurationInMin + 5 | extend JobDurationString=strcat(tostring(JobDurationLowerLimit),\" to \",tostring(JobDurationUpperLimit), \" min\") | sort by count_JobUniqueId_g desc; let Selection = JobsWithDurationString | search {selected item}; Selection | join ( JobsWithDurationString ) on JobDurationString | project JobDurationString,JobUniqueId_g, JobStatus_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s "
+ }
+ }
+ }
+ }
+ ],
+ "Filters": [
+ {
+ "FieldName": "BackupItemType_s",
+ "QueryForValues": "AzureDiagnostics | where Category == \"AzureBackupReport\" |distinct BackupItemType_s",
+ "Title": "DatasourceType"
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" | where SchemaVersion_s==\"V2\"; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" | extend JobOperation_s=columnifexists(\"JobOperation_s\",\"\"), JobUniqueId_g = columnifexists(\"JobUniqueId_g\",\"\"), JobStatus_s = columnifexists(\"JobStatus_s\",\"\") | where JobOperation_s in~(\"Restore\",\"Recovery\") | summarize dcount(JobUniqueId_g) by JobStatus_s ",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#eb3c00"
+ },
+ {
+ "value": "CompletedWithWarnings",
+ "color": "#ffb900"
+ }
+ ]
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT652 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT652
new file mode 100644
index 0000000..d2b01e4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT652
@@ -0,0 +1,73 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-la-reporting/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898664,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-la-reporting/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT652",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT652",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "GEN-UNIQUE-32",
+ "properties": {
+ "mode": "Incremental",
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-32",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-10-01",
+ "location": "[resourceGroup().location]"
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "workspaceName": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT653 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT653
new file mode 100644
index 0000000..2955cc8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT653
@@ -0,0 +1,191 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-la-reporting/azuredeploy.json",
+ "/demos/backup-la-reporting/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898676,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-la-reporting/azuredeploy.json",
+ "/demos/backup-la-reporting/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT653",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT653",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name."
+ },
+ "value": "GET-PREREQ-workspaceName"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templatelink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "nestedTemplates": {
+ "backup_jobs_non_log": "[uri(parameters('_artifactsLocation'), concat('nested/backup_jobs_non_log.json', parameters('_artifactsLocationSasToken')))]",
+ "backup_jobs_log": "[uri(parameters('_artifactsLocation'), concat('nested/backup_jobs_log.json', parameters('_artifactsLocationSasToken')))]",
+ "restore_jobs": "[uri(parameters('_artifactsLocation'), concat('nested/restore_jobs.json', parameters('_artifactsLocationSasToken')))]",
+ "azure_alerts": "[uri(parameters('_artifactsLocation'), concat('nested/azure_alerts.json', parameters('_artifactsLocationSasToken')))]",
+ "on_prem_alerts": "[uri(parameters('_artifactsLocation'), concat('nested/on_prem_alerts.json', parameters('_artifactsLocationSasToken')))]",
+ "backup_items": "[uri(parameters('_artifactsLocation'), concat('nested/backup_items.json', parameters('_artifactsLocationSasToken')))]",
+ "cloud_storage": "[uri(parameters('_artifactsLocation'), concat('nested/cloud_storage.json', parameters('_artifactsLocationSasToken')))]"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-10-01",
+ "name": "backup_jobs_non_log",
+ "type": "Microsoft.Resources/deployments",
+ "resourceGroup": "[resourceGroup().name]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).backup_jobs_non_log",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "GET-PREREQ-workspaceName"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "backup_jobs_log",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).backup_jobs_log",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "GET-PREREQ-workspaceName"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "restore_jobs",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).restore_jobs",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "GET-PREREQ-workspaceName"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "azure_alerts",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).azure_alerts",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "GET-PREREQ-workspaceName"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "on_prem_alerts",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).on_prem_alerts",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "GET-PREREQ-workspaceName"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "backup_items",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).backup_items",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "GET-PREREQ-workspaceName"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "cloud_storage",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).cloud_storage",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "workspaceName": {
+ "value": "GET-PREREQ-workspaceName"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT654 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT654
new file mode 100644
index 0000000..6b8d452
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT654
@@ -0,0 +1,729 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-oms-monitoring/azuredeploy.json",
+ "/demos/backup-oms-monitoring/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898685,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-oms-monitoring/azuredeploy.json",
+ "/demos/backup-oms-monitoring/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT654",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT654",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceLocation": {
+ "type": "string",
+ "allowedValues": [
+ "centralus",
+ "eastus",
+ "eastus2",
+ "northcentralus",
+ "northeurope",
+ "southcentralus",
+ "westcentralus",
+ "westeurope",
+ "westus",
+ "westus2",
+ "uaenorth",
+ "switzerlandnorth",
+ "uksouth",
+ "francecentral",
+ "norwayeast",
+ "koreacentral",
+ "australiasoutheast",
+ "australiaeast",
+ "japaneast",
+ "centralindia",
+ "southeastasia",
+ "eastasia",
+ "chinaeast2",
+ "canadacentral",
+ "brazilsouth",
+ "usgovarizona",
+ "usgovvirginia"
+ ],
+ "metadata": {
+ "description": "Specify the workspace region"
+ },
+ "value": "westus"
+ },
+ "workspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specify the workspace name"
+ },
+ "value": "GEN-UNIQUE-10"
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure Backup Monitoring Solution",
+ "solutionName": "[concat('AzureBackup', '[', parameters('workspaceName'), ']')]",
+ "publisher": "Microsoft",
+ "displayName": "Azure Backup Monitoring Solution",
+ "description": "Monitor and analyze your Backup Vaults",
+ "author": "Microsoft"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "westus",
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "Azure Backup Monitoring Solution",
+ "type": "views",
+ "location": "westus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "Azure Backup Monitoring",
+ "NewGroup": false,
+ "Color": "#00d8cc"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAgAElEQVR4Xu3dB2ClZZk24OecnF6TTJLJJNP70EEEFRRkERQFXFQW1rWsZXV3de2/uoB1BTvruqwN112wAoroIiBNROlKnZ7JtGTSM8npLSf/e79hBCMzZL587ZxzX/vHZCbzM5NTvvt73vK8nmlFiIiIDpN39m8QERHNBQOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgM8Uwrs3+TiOrflHrnp8pVmaxUJVeZlqz6PFyclv2lKfX1tOTUHyhWp0X9Pymry4TXI+L3ePSHT916RtX/JP0eafZ7ZUHAK5EmjyTU57j6HPfz3rQRMECIGkDh6TBIqZCYKFVVSFRlX74q/fkpFRpTMqY+surPTKpAwZ9T+SFTVYTMzOXhwEVCZYgOEo/MhEhA/SKoPhK+mdDoCDVJuwqR7ohPukJeaQ4gZLwSU6ESVB/481Q/GCBEdaii3taoKjIqFLany9KbmZK+fEV2ZisyWJgJi9LUTFCoTPlTQMyXygj9gXBBsCA8OlWoLI/6ZJkKlVUx9bX6jOol6mOY1DoGCFGdyKtAGFeVxYAKiMcnyvLkZElVGaq6KE3pMCmqoMBwlBMQKsEmkbhvZrhrmQqUE1uCskYFCgImqX4PgUO1hQFCVMMwj4Ehqc3pkjy6vyyPTpR0lZEqT+vvuVlQVSkIjrUxvxzXEpCTWv2yQlUnnD+pHQwQohqDN2y6XJUdKigeGivJQ+NF2asqDUyIq+KjJoVVddKqEgXDXC9rC6lA8cti9ZsxjIWRazFAiGoE3qhjxarcP1bUH4/sL+lfu73SOFyqKJFOFR4ntQbl1AUBOV5VJ5hLIfdhgBC5XKk6LftUafH7kZLcM1KQrZmyqkBmltfWM8yxJwMeOToZkLM6w3JCs186gk16FRi5AwOEyKUQELtzFbltsCC/UcGxK1up2SGq+Yr6RDbE/XKmCpIz2oN6uTA5jwFC5ELYn3H3cEGHx3ZVcTRqcMwW86Ei8ctruiJycmtA2jATT45hgBC5yGixKveMFuXGvpz0MDgOCkFyXHNAXr84LC9oCXDllkMYIEQugJ3iT6XK8sM9WXlwrCjZyuw/Qc9lQdAjL+8Iy98sCcvKqF/vNyH7MECIHIaNfz/Zk5Nbh/IymK/O/jY9D2TGyliTXNAdlVcvCun2KWQPBgiRQ7C66r7RovxAhccf95fqbjmu3TCvfnpHSC5eEpFjmgM6WMhaDBAiBwyrquP6vrzctC+nvmbVYaYVqhp549KonL0wxLkRizFAiGz2xGRJvtubld+p6oNVhzWw7PfszrC8ZXlU724nazBAiGyCifI7hgvy3Z0Z2Znh8iqrYcMhNh/+w6qYvKAlyAl2CzBAiGyAPlWY6/jRnqxudEj26Qp75W0rYnJuV5gdf03GACGyGDYFour41UCe+zoc0hzwyEVLovI3SyLSwlVapmGAEFloa7os/7E9LfePleq2dxWGhjBX7fZwRG68RlUh/7gqJu04nITmjQFCZBGczfEf29Lqc3n2t+pKW9Ajr+yMyJ5cRS8McHNQIuzO6gzJu1SI4GREmh/WckQWeGCsKF/Ykqr78IAmj0fO6AjKJRsS8qpFIX22h1th1dutAwX5yta07Mpxu/98MUCITPZ7dRf+5W0p2ZJqjAvU1DSOy52WhaEm+cjahLx9ZVy3GHErFEj3jhTlSyrgMcRIxjFAiEyEyuPK7SnpSbt8QsBk5afHrdBG5M3LIvIBFSTLoy4uRQRBX5Irt7ESmQ8GCLkShhrQ6iOvvshUqvoIV3xgOeyBr/GRrcz8GfxZp4fecULgV9QFqdHCA55dbwS8HnnNorB89qiknNIWcPUBUA+MleSrW9P63BU6fJxEJ8fh7hWb7Arq834VCjimdUh9TJaqKjymVUhUpfL0qxRNP3A90h9Y/aP+B6294z6vJNXdb3vQI4tCTRJt8kqoySNYbOPDH7TYlnRZLt+UkicmG29IBJPonzwiKS9tD83+ll7CfM3urPyiP6eCfvZ33eMVC0PykXVxHlR1mBggZCtUFgiEjPpiQF1RBgpV6c2UpTdbkZHClExUZqoKVBQYFcHHs9t9HPgSkYCv8Rkra2Y+ZgID52fHVIAsCjfJiqhPf2Az2UL1zZgKmgjOSjURhkCuUOHx4Hhp9rcawqECBHLq+byxP6+CJCNDLu37hSrp/O6wvH9NnOevHwYGCFkOL7CMqiwGilPy5GRFNqfKslOFRp8KEAw/ofooWXRdwQ0ldh9HVWgsV0GCMyOOSfrlSPXRqiqW8Dz7W4yrf/jnt6Tk14OF2d9qGM8XIICbgHtHCnL1zqw85dIqDfcVb10elbevjM37ddEoGCBkGcxXDKrQeHyiLA+ru/NNKjjGS1OifsuxJoK4SKACwYohHI364gVBWRf36Y1lh3vRQKX07d6Mbk9iVQDWgrkEyAEY6vvWjoxeqebGxyzh98g/r47LGxZHXD134xYMEDIVgmFEJcRGdZd590hRd54dVb924xwlrg+4YGCo66SWoLykLSAbEv45DWHg5/zxnpxctSPlyp/NTocTIIDXx3V783JdX1YmS+67/CwKe/WellPb5vbzNDIGCJmiol5Gw8WqPiDptsGCPs97ouT8yqi5QmagR9KJLQE5oyMkJ6jPGOI6GKy4+uTGCenPufA22maHGyCAocubB/LyvV0ZVz6GGOb89FFJPX9GB8cAoXnBnXhfviJ3DyM48no5ZK3fkSdVVYIT7c7uDMkLVZBguOvZejIVvcscw3JkLEAACyT+OFGS7+zI6EB2aljzYF7TFZIPr03wiNxDYICQYftLVblLBcfP+3OyXVUcbm+md7iwPBiVyIVLwnJ8c1BPxOPOGbvMf96Xd90FzylGA+QArGK7ujcrt6sbkKKLihG0ZHnP6oRctDTCs0QOggFChw0b+HD3fYMKjsfVHWS2xiuO59Ma8MhpHSG5cHFEtqQrcqUKEJ7p8Yz5BgjgZgRLfTEvMph3T4p0hr3yKfWzvWhBcPa3SBggdJgwRPXDPTl9tzjuwglQq2BFDiZXVXbKSKFaM3M7djAjQAAV3R1DBflWb1p6XXRi42ntQfnUkUmeI/Ic+IjQnKCdyP8NFOSyJyfl+r25hgoPwHg9JnuHGR6WwTAR5p0+rS7WL1MX7TkshrPFg+NF+Vk/hyyfi0ueInIzLLv8xo6MXL55QrfqcPN5D1T7jk4G5NINCb0Xww2t4TG3d0NfVu9hoT/HAKFD+uP+knxmU0quU1VHra+uotqBnlQ4OfB9axJ6HsJpmJfBewCbR+kZzj8z5Eo43+HWwYJ8atOkPjsBY/9Edor7vXLhkohctiEpxzX7Z3/bVoiN34wU5LejxdnfamgMEPoLaH6HXdb/vi0le7LumcykxoPFC6e0BeXjGxJy5sKgPtfcKdg1f2NfTobrbb36PDj4dJAbYTnld3Zm5Js70jLo0s6p1HjWxf3ysfVJeduKmKOnHWJI99dDBc4DPo0BQn+C8PhWb0ZVH1lXn91A7uL5s+OkrNMW9Opuudjc1x1x5tKFKRAEyDA6ghIDhGZgpdV/9qT1El2GBx0OzJfZtcQVh4Sd3xWWy49q1s0vndghvi1dllsGCvrMmkbHACF98t93erPyy31c605zgz0aWGKrT4P0e/TpkHbBvMixzQE9L3KOChO7DxHEFMgdQ3kZ4FwId6I3OixLvEpVHj9RlQfDgw7AnT1CAscB45yUmAqJJI4NVr/ZFvLKAn+TdKjPzTj9UYXI2rhf79S2MUe0yXJVft6fl2t3Z2S0aN8LGJP5WGJ88dLGPjeEAdLAMPTwg905VX2kOWzV4HDQVqAJVYVHukI+WRnzSXsAYdEkS1SpgTNTWlVY+NXVEuHiezpc3AA3PrcPFeS7OzOyPW3fZqUTWvzyxWNa9NxMo2KANLAb+nJ63gPndlDjwGUfwz7YZ9EWmDk7Hquc1qrQwBkoLeqCmGjyqkDx/KkKcTu8gnHiJU47vH/Mnn1LaPv/0Q1JeeXCUMNWIQyQBoX+Pp/ZNOnKw3zIfLjARVQgYNgJpy6uic0Exmr1EVPlRLBpprKoddij8YM9Od16xI4u0dibcsmGxm20yABpQDi74/JNKXl0gr196hmqDMxZdKkvcEDW8c1+6Y40qapj5vx3rGiqR5jXw4KQa/dYf9phpwrky49u1ufGNCIGSIPBWR6Xb0npZYhUfzDkhIltDEkd3zITGssiPn0YVr0GxnPBvMgf9xflqp6MPGbhjRIe0jcvj8q7V8Uk2IDjWAyQBoI31c/6Z1qU2FHekz1wEcN4/FIVFCe1BuXE1pnQQPXRSKHxXLapavu7vVm5Z6Rg2YmZRyX98uVjm1U1YvN6YhdggDSQR8aL8ulNKdmbs+idRLbCPgxMgJ+sQuPFCwKyXlUdOL870IB3woeCfU7X9eXk+3uyup+V2ZIBjz618OUd8ztQqxYxQBoE3kT/tjmllztSbWtWF6zVMb+8tE0FR1tAloR9ek6DDq6gyu9bBgtyze6M7DT5tEMsgX7jsplhrEZ7HhggDQAdFzB09eWtKcvKeLIWLksLQ149GX5OZ0iOSPilNeitiSW2bvLEZEm+uSMjD42VdF8rsxyZ8MnlxzTrocNGwgBpALtyFbn0yUl5atK6yUSyBuKhXQUH5jbO7wrJWlV5JBt0yahZ+vIVuWZXTlUkecmUp005ohgdgj97JPpzBWd/q64xQOocSnccR/vDPVlbNleRebBn46XtQTl3UVhWRn2ScMsh4XUAS33/byAv39qRlnET5kWwGf1Ny6LyzgZbjcVXZJ3Dno/b1J0Ww6N2tAQ8cl53WK44ulk+sjYhxzUHGB4mw7LmpZEmvYHSDMUqhsfKuqJpJHxV1jH0uvq/gYIM8WComoDh85d3BOXTRyblQ2vj8oKWQMMvw7VCXlXlv9iXl69uS8uwie8NDI2NlhprkpEBUse2psry25GCKWO8ZB2s4jmxxS8fXpfUy0Ff1h7SezjIfGh1gs2FX9yS0o0XzexAnVLVx47sVEO93/gqrVO4y/rVYMHUOywy36KwV/5uWVQuU1XHa7vCnCC30BZ1Q/WVbTi6ICsZM5dgPQ0V/+5sRcoNdNAUX611aneuIveOFky9wyLzYNPyy9qD8lkVHNg/gOWfDTT3aiu8B+4aKsilGyfkNnVTZdV8IP67PZmynqBvFAyQOoQboAfHSjLK6sOVFkea5F0r43LphoSc2BrkPIeFcODU93dn5YvbUtKTtn5+oj8/JfutSigXYoDUobHSlNw1XNArQ8g9MDp1mqo6PqWqjjctj0hHA/ZOshOOnP3a9rR8c0daBvP2vBkmVHjsL9nzd7kBA6TOoPp4fKKsNw+Se2BPB/YJ4BzvE1sC3EFuIQwgPTxelM9umtTH3dp52ib2XSG4GmUQiwFSZzKVqjw4Xmq49ehutj7hk/+3LiHvXBlryI6tdjrQ8wp93+4bLekbKjvh79+ZqUixQSYfGSB1ZlSVz49OFDl57gJYiYsT6zBkdebCEOc6LIaho+/uzMoXt0zK7qyNZcezYPpjn6pAsCKrETBA6kxPusKNgy6AVusXLYnKR9cndJt1slaPuuv/6va0/O+ujEyY0JrEKNy4Tagga5R5dAZIHUH5/OD+YkMtI3Sj9qBX3rM6oZfntgcbY8jKqVccLtj3jRblE09NyC/78+KG+eu0ev+VG6TFIAOkjqQrVdkyWbZ93JeesSzaJB9al5CLlkZ0v6V6gos1Nqim1O31aLGqT/v7vbp43zFUkH15+yeO8W+5vi8nn9syKZtS7lk0glWQmItsBOzGW0ceGi/KpU9Ncve5Q3AmxL+sjcsLW4I1vylwJiyqupqdVBdD7CnqzVakTwXFcHFKD9NgvwM+R1RQYpEAWrDY9WOjJcn3d+fkp/1Z1x3PjNbuVx7bos9uqXcMkDpRUmXHD/fk9Jp3HhplvxNa/PJ+FR7HJGvzooGqNacCAy0+0MUAp/YhMPAxUKjo4VHc8aNX4OwR0oTfoxtA2nWk6xMTJbl6Z1YPXc3+t7gBjri94qjGOBuEAVIn0upu8Os9GblBlfQcwrLXya0BeZ8KD5wSWEvQswnj9egguzVVkUfVhbk3U9GriDAEowqNOa3ma1N33J88Iikvbbc2QLCyCaHx7d6MbHbRkNVsMVWRXaYej7M7rX083IABUifQQuHSJyfURYCnDtoFw1QID8x5rI7VxlGmqFTRNRZVBjacPqZCY0e2LJOlaT1cZeRiYEeAYN7lJ3tzuhHiaNHIv9I+WIH3sQ1JOb8rPPtbdYeT6HUCPX+GcMtItkF4YNiqFsIjp8IBk97XqYvwZzZNyiVPTag7+bT8dqQo/bmZoSu3XpZxc/Sfqrr+750Z14fHAY3SkZcBUicwmZmby3gDmeIFLX754Lq4rHPxHg9cxDAchQ60X9iakg8/PiFX9cyEBnpDuX2uDC/nB8eLcpkKOwzN2tmSZD7wLnTj3IwVGCB1AG+0PnU1wPDE4cDGaHxgxzQa/eFcZ3zGr/Fx4Pt2raypFcck/fLeNXFZE3NneOD1sDNbkZ/25eWyJyfk3zZPyk39edmTnaqZizDCD2eWX745JX/cX3tL0zExUGP/ZEM4B1IHsDoGXUd/vCf3p997Jgg8uoVGVH94Jeb3SLP6RtTnlYj6vaD6Pv4cmvupb+sXPtpo4WWB3bSV6ZnVN4XqzGe9rLOMu9dpPamJ38NnvOH1n6/W9xtnZaxJLt2QlBNa3LfaCs8JmmjePVyUO4fz0p+zJzDMngPBHhMMtV3fl5X9Du4qNwrtzt6zOi5vXBat+5svBkgdwATjFVtS+vjaReEmWRn1693QC9UruSPYJF0hr7Spr0MqLLAv2qc+YwJYf6hfozGs51kv9QOj4XhlYEfJgbupKfUF7m7xgcDIqi/GitgXMC1Dhaf3B6h/y4C6amE+BivD8GfdPlQyV3hMP7wu4brVNbg778mW5fbBotw2NBMcdo5mmhkgaEmCVVY4AKpWh4Fw8/auVXF56/KoruDrGQOkDuDO88nJkv7cHfFJqyopAiodfE9XIFa/hnEBQ+sGVB8V9YsMgqU0pcIFE/tV2Zwqy65sRS8XRZdgzNXUWq8g7HX4Z3VXeUF3WD+mboDHfV+hIrep4LhlMCd7s2jiN/tPWc+MAMENyQNjRb2/A6vDahleHeeq18nH1yckXOcJwgAhS+Eih2DDEBgqlO3pimxTH1g6ik1qk6WqLcMs84EhPpxbjt5WGPJzA1R3tw8X5Ya9WdmewTncs/+EfeYbIFgh9tP+nFyzKysjTiSgBdYlfPLlY5tlSdj9K/TmgwFCtpoZ0sIGtqpenomL3x/GS7I1U9btuFGhuOkFibg4qzOkl+sucsFZHpiTekzdoeOgpHtHCjLpgnNf5hMgg0+3JPm5ChAsJa4XaGfy8fVJOaMjVPNtbQ6FAUKOQoWCXc84x+SpybLeDY3hOLsmgJ8PVlxdfkxSFrvgThIX21sGCnJdX1YGbDqidS6MBsjj6rn+Vm9GHhwr2TpnYweMXJ3XHZYProlLHCVsnWKAkGvgIpJ9ujJ5SFUl948VpUdVJuOlaUeWcTYHZu4inZ40x8++MVXShyWhYabbTis+3ADBcvN7RjDfkdEtVOrVC1sD8rmjktLhgsrVKgwQciUM1aDlxrZ0WV9ssKEMLcPtWtEVVQXH21bE5c3LIo5OmmOF3c1PVx1ocOhGhxMgWFhxXV9OblA/z1iN7Co3CkcZf/34lro+E6Z+ayuqadiX0hrwyosWBOV9a+Jy+VHN6oIe0y3TseHRai9Wf+/rHF5xhf0QGOL5ek/KteFxOHRLkh1p+R9VedR7eABWG2LYsZ5/UlYgVDOw1HOwOCW/HS7JHUN52aKqEyvmSbojXrni6GZHW7MfmB94aKzk+v0Qz1eBYGjyYVVBfkf9PFgAUG/zHQeDeZA1cZ+8qjMsL2kLyLKITy+vrycMEKpJ6PF0+2BBbhnM66XBZl2U0En13avi8qZlUUdWz+DHQMtydBbAcudacKgAwXwHhuDQuNFNE/92QpCsjPnk3K6wvGJhyBWr+czCAKGahYvTXlWC3KouUL8emun1NN8XMybMP7Y+IS3YTmwzzPv8cl9Brt6Z1h1ya8XBAmSk+MwSXTcsN3Yabk7Wx/1y4dKo7uSMIdpaxwChmofqA5PtP96bkzuHCob3EywKe+ULxzgzdIW9MTfty+sTJWut/xMC5BMqQHCk7QEYXvzezqzcrp4PJ1bQuRmCBKcVYnPqseq15kSla5baj0BqeBgi2JDw6zX3l6gL2THN/sPuQYSJ+XM6w460Z0d44LCk7/TWXngccOAiiHmq348W5bMbJxkeB4F5uzuHivJp9Rj9r959b8FEnk1YgVDdwfzIT/bk5Jf7cnoPyVxgkvOSDUnpxu2hjdDNGOFxdW/GcOXktI6QVz5/dLMcmfTLj9Tj/sM9WRku1M4QnJMwioWVhm9ZHpXjm2uvGmGAUF1C2/nfjBTl2t0Z2fI8m9WSfo98XIXHWQvtbTuBORyc2YE5j1pe1rpQBcg7VsZ0aGC/Co7HpcODYwLevDwmZ6vXYC01YGSAUF1Dw0YchXrHUOGgmxCxMuYTRyRsbTmBeRv0s7qqJzXnKsmtfOp6F1chjArKyaaOtS6mHsjzusIqSKLSWSMrtex7xxA5YGXUJ+9fk5A3LYvpSmM2tCt59aKQreEBvxstyH/vStd8eABG3jB3w/CYHwQwDtK6cltanyhZC1iBUEPAqYl3Dhflu71p2fH0rm6MFLxhSUTvdLdz2AANIz+7aVJ662B3OVnj2Ga/vHd1TE5sDc7+lqvYe9tFroSVMhhSOfBRj3cUOMfjVZ0h+ci6hByRmOms2xb0yjmd9o45o7XFN3oyDA86JByq9cWtaX3IlpuxAqlTCAIsqUQ44O47OzVz1gYOdsIBPpjALVVF/xpfYxgCrwRMIuPIW5yhHvLia9FH4UbUF7jQ6rPV1de45uJ76FlVax5TFcDXtqVlVXxm6W8Eg/g2mFAP+Nd60nJjX372t4ie04pYk7x3VVxevjBk+cmiRjBA6gT2EmBJaF6FAbrWYgwVn9MqGUbUXe9ocUpS6muECf4sdj3DgXX6z34VzJyRPvPZq75CM9Fwk1cFh0da/DNnrSd9M5+XRb2yNOJTwTITMGGf9UfomqEvXxG/+gHRKdWOlVd4brCxDud9A+ZIEb4zIYzhtGfOqUe1hCaOCHocFYznBs8Xjgw+cGOAwDerfQu52+JIk3x4bVxO7/jLVjFOY4DUKIQAWn0PqHDYV6jKllRZtqbLMqbucnHa34EqQ59TbvIzrKsPz8x567h7x+oRBMuqmF/WJ/yyNOyVLhUqzahaaiRQrIbmiP/Vk9HDg6tjPlmggmtB0Cut/pnqLqYeVJXBKkA8em8AHjNUiAgOVTyqCnJaH/+LmwDcDOD0xiH1eUg99zh/Hs/3zM3B7L+Z6sHyaJP8v3UJvYPdTRggNQR3seOlmbBAV1O079iZq+gT/bCZ1ek7Ulz0cGcdUhdDnOC3NuGTIxMBOb7ZLwvUVTFh80ont8Dzgos9nr829Tjg8UH1YXTqBf89BAsqEazcwU5mnLPRk52STamS7M1N6fPn8/omYvb/b6pVq2JNctkRSTmu2f5WOwfDAHE5XHRG1R3m5smKPLK/JE9MlvQFI112/8UBVQqGvTBZvVpVJ6eou6e1cZ90q5Sxe9ms0zBUaPVQGapSnEGBCrQnXVEVaUW/XnarmwzMv1jR+p7shZuxTxyZlBU48cwFGCAuhCcEwxQ9mYo+jQ+Tvno+Q4VGLT9ZeM23Bprk+JaAPrAJbwbMQRi9E6dDwxAmXjM4Q+VJVbHeN1bUVSuGv4ouv/mggzu9Iyj/uj7hiqNyGSAugjFsLPP8w/6yPjAJAYKhCaeHpsyGwIj5PbJKJcpp7SE5sTUgKyI+21ZDNSIMd6GlOqqRP6pKFg0Pd+nKpM5eXA0AxfvfLo3Ku1fFbF2C/lwYIC6AoYe9+Yru0HnXcEH61dc1shF13nAThcnkl7aF5Ex1Z3VkMuD4m6LeIUyw2AJzaXcMF1WgFHUfK7MXW5B1UM2/b21CXt8dsXxo9FAYIA5CcOxRYXHbQEHuVMGBYSq3z2tYBW+CdhUkOFPir1SQ4EwOViTWS5erul8Ybl5+N6ZuXnJTHN6qEUsiTfK5o5OOnF9zAAPEARiSQpVxU39e7hopSJ9607KP0AxERnvIK2d0hOQ1i0L6fA4sFyZrYbFGv7qBwYFcd6vX5M5MhUFSA85YiPmQpF6o4gQGiM1G1bsSnWFxVsUWE8/yrjeIjG51h3XuorC8UgUJlgVzZMt6GN7qQ5AMF+WWgZzs4c2Nq2EI+B9WxvV5Ik68PxggNsEE+e9HinLjvrw8Ml7kkso5wqa6NTGfXLAkKmd1BBtu+a9TsM9kV3ZK3ejk5ZbBPA+IcrGusFcuP7rZkf0hDBAboK0Izn64SVUdXPViDCYN0crhDYsjcnQy4MjdViPCUmDsor9pX0HuHSnolVzkPq/uCumd6kmbb7AYIBZC1fGb4aJcsyujN3Vxlcv8LY02ycWqGjm7MyStKE/IFphsv2e0JD/ry+pOsRx6dZeE3yPvX5uQv6aembgAAB7uSURBVO4O29o6iAFiEUxI4nCYwzmXm+YGx5ZjtdbbVkT1JDvZB+fNX69e1zcPcFjLbY5O+uULxzZLl40bDBkgJsOdGQ4Muro3Iw+Pl3inZqENCZ+8aXlML/tFB1uyB5afYzPiNbuz8oh6jbOydgeMXr1ndVzetCxq294QBoiJ8Ma6ebAg/7srI3uynCW3Q2vAIxcvjcqFiyOS5JCWrQ5U2TcP5GS0yMuIGxypbqo+r6qQJWF7emUxQEwyjNK+L6/eUFlONNoMFfsrOsPytuVR1zSZaxSY57t3pChX78zIdi5LdxyGd9+xMi5vXhaxZf8UA8QEGBf++va03DVU4OYrB72wNSDvXxtXd2GcF7EbzqL5wZ6c3DaQ53vAYetVFfKVY1ukG2liMQbIPD01WZJv7sjK70bdfXZxo1in3jzvXR2TFy8IcamvzXDg1Y/35uSn/TlOsDsIcyEfWZ/QS96tfgtw0HgeMJH4hS1phoeLbE1V5PPqObldVYMHjusle2AO6u9XROVDaxOyLGr93S89N3QOuGe4oJdeW40BYtD9Y0X54taUPDlZnv0tchh6i125LSU37cvr1hxkn4DXo/foXLIhoYcUyRnbMxXZlLL+2sQAMQBnKXxJhceWVIP0XK9BOCv8qp6ZEOHErv1Oag3KpUck5OUd7jrDu1GMF6v6MDo0ybQSA+QwPaAqjyu3p6Q3w2W6boelpd/uzcgvB/K6txPZa1nEp8fiz+8O655mZB/szfnD/pnjr63Ep/UwPDRelK9sS0tP2tonhcyDydxv9KTl1kFn50TwVyPE9LnlFRw1W9WTzjhedlx94MzySfV7WfU93DVieazFN4+2wK7oD6yJy4VLonq5NdlnT64iT05aO0rCVVhzhNPbPreZcx61qjvilY+uS+gWKFbCRT8/VRXc+GXUZxxJjBb+GfUNhAU+cur3ESSY4yw//fbDijGfxyMB9UVUfcTUR2uwSfc4Svo8+ux49P7C2n6c2BiqsSVmCMdrdmXlx3uzDXPaptPwCnnDkoh8cG3cstcLA2QOcHb0FZtS8uB4afa3qIasijXJx9Zjcte8cfkDgbFfXSBHVLWzLV2R7ZmyPl1ySKVIRlUURfWHUH3gzyI0UAkd6k2H/V8zgaI+1C9UhugLwCJ1C9+sQgRDQ2vjflkeVaHi96qQ8Vp2gTATKqtrd2d1pwaGiD2wJ+TK41r0a8cKDJDngeGFr25Lya8GnB0CIXMc2+yXTx6ZlJXz2LGOl0FKvS4GVUBgtctTqirdpD4QGOnKTPVh5fATDp9DYGDZ7NKwT/9M6+M+Wa1CpVmFiZvPlM+ox+d/dmblB3uyPBPHBh2hmbNCTmyxZkUcA+QQME79jR0Z+cnenKUXBLIXVgZ9XFUiHYd5V4aL36CqMv44UZKHxor6REkMzWBOw8nXB36MyNMVytHNAXlRa0DWJfzS4tLKBI/X93ZlVTWSkQJDxFJ4bbx9RUw3WLTitcAAOQhUGzf25+Vr21OSYm+ruoKdun+n3lDvWhmb05sKk92b0mW9LPLh8aIennLr3TN+nLjfI+tifjmlPSintgX1RPZcfk474TH9j560PmjNyfBtBGdhX466YbKi2SgD5CDuGy3KFVtSsjfn0isFzUvEJ/oAntd3R56z9TUuasPFKd2u/NbBvB6qwoR4LV3s0AqpS/0P5nxesTAk6+I+ifnMv4gYhcfz31WI3Lwvz+FhCx2R8OlzQqzo0MsAeQ5oU/3Jpybkkf1ccVXPcLrh5Ucl5ajkn48Pp8pVuXO4qA9N2jhZcm21cTgwFn56e0jOWRSSDQm/a85PQSPSz2yclAfGuEDFKu1Br3z6yKS8pM28xSMHMEBmwfjs19VdEc45qKW7TTLmZe1BuXTDzHwIguN+dSH7xb6cPDFZlnSdDV1iFGuRqkhOUReS87vCsibms6Xl9/N5UoX0FZtTsomdHSyBSvQD6w5ebc8HA2QWtL748tZU3V086LnhovqW5VF9d4aK47bBvLqJmP2n6s/iSJNcoC4o53aF9B4Tp/1utCCf2ZRiF18LYM7vrctj8o6VUdMrTwbIs/RkKnLpUxPscdVgsKIXeymw4c+GBqaugTvT41sCcvGSiJzYGnR0+S+aXmK141Wq+q+HIUM3wbP6qkUh+Sgm0pEmJjL3v1bDsMnph3uyDI8GhE1tA/nGCg/Ahfq+0ZJ8YuOkfHNHRgYdXFOLobTXL47I+RYMszQ6VAhDhZlNrWZjgDwNx3L+dqQw+7eJ6t7+Eu7+s/Jvm1L6jBunVkRhqfFFSyNyVJInSpot9XT/NbMxQGSm6dg1u7O6eytRI0LxgYPRLts4Idf15fRiEicsj/jkn1bFpCvMS5OZMMKCfmxma/hnCY/p7UNF3SyRqNH156ryXz1puXpnRjd+dMKJrQE5ryuiJ3/JHFPTaN7JADEdGt/9cl9O988nIuyDmZbvq4r8C1tTstOBrofoSnxBd1hevMD8fQuNCjfKkxasLG3oAEFL7Zv3FbjbnGgWFB+3DhT0yZtOhAj25Vy0JKI3wdH8VVT1gbNmzNbQzw7ODL5zmL14iA4Gq7Qu35ySxyfs3ymOoazXdnMoywwYjOQQlolQfdwyWNDdVYno4B4eL8kXt6RsnycMeD1yfndIVsXM7+HUaBAdJQu2/DVsgPRkynLfGM/4IJqLjamKPs55o80hsijkk/O7InrTI82PBfnRmAGC6gMrrwbzrD6I5gqVyJe22Dsngs3xZy4MygkWHYjUKLA3E4sTzNaQAYIjau8bK3Lug+gwPTZR1rvWR3Dsok3agk16LgTnnJAxeOSaLLjaW/CfdDdMJN09XJQ9Nt5FEdWTO4YK+qROHAplB1z8TlIVyLGz2u7T3KE9jBWHijVcgIypF/3vR4tStOe1T1R3ULn/aiAvN+6zbwVjIuCVVy0KS8xn/kWwEfg9Hmm24LFrqADBax0l+C5WH0TzgtYnaD5697A9C1Fw6Tu5NSDHNbMKMQLDVxEGyPygv8+D40VLNtQQNRqc3fHt3oxsS9uzMqtFVSE43xvt9+nwYAI9ZEGb44YKkL25iu42yvggMse2dEWuVZWIHTdlGMI/SVUhK6Ps1nu4YurBi1mwI9P8/6JLYaz20YmyjNq4eoSoEdw1VJBbBwu2zIe0Bb16KMuC+eC6tiDYJHEOYRmH866xdLcRjislshMOpvrhnoxsTlnf7gRDMae0B6UlYP7FsF4hbJdEmiTmM/9yb/5/0aVw2hp2n9twk0TUcHZkpuTHe3GevPXvsKVhnxzFJb1zhpGrDlWBoDWM2RomQNCCwanzDYgawb2jBXlAVflWaw545dS2oEQ4mT4nCI7OUJMlw34NESA4jWuzChBOfxBZZ7I0Ldf35WTA4rPVcSHckPDrVVn0/FrV47Qsak0zsYZ4BsZKU7oCsb64Jmpsj06U9E51qyfUl4abuBprjrrUY9UWYIAYhgOjxrj1nMhyKD5uGyzIsMXlfsTnlSNUFWLBwqK6gvkPBG3YivEraYAAQefdJyfLkqkwQIjsgMUq94xY26wU18Njk36JMkEOCY/Pcc0MEMMQIDsyFfa+IrIJqpDbB/OW77laFG6ShAWb4+pJs3p8VsZ8upmiFer+0c+qAOnPT9nSr4eIZmxJl+V3YyVLq5C4zysroj7dJ4ue25GqSlsYtGb+A+o+QLD/Y7DA3YNEdkK/0ruHCjJh4dJ5DM+sUXfXFl4faxoWqR2dDFg2fAV1HyBYUpixYXMTEf25TamS7Mha12gR+xu6Iz7xWzU+U+M6w016/sPKh6euAwTDViOFqnD+nMh+k+VpuX+sJBUrDuOWmYn0BQGPBOv6KmbchrhfukLWlmd1/dCXVILszVeEBQiR/TD/8ch4ydIl9DjuNmpBj6dal1TBenpHSOIWLzKw9r/usKJ6Be9DpzcickSfuoHDIW5W3cMl/R5Lx/hr1bKIT05o9lu+wKCuAySvKpDJsnV3P0R0aOnytDw+UZK8RcMA0SavJV1maxny9CULgro6s1pdP/JYwssJdCLn4O2HjbzjZWtGAjCRjl5P9IzOsFde3hG0pHnibHX9yGdV9VHmBhAiR+0rVGTAwqFkG66TNWOm+gjJkrA9rYrrNkAQG2Olqp5IJyLnZMrTsjFVsWRTIcKDI1jPWBxpkvO6QhKxqcVL3T70yA0MX3EEi8hZWISF4xSsuJnzeGaGsWjGixcEZW3cvi7FdRsgU9PTklJ3PvhMRM7anatI2qIFLXyLz+gKe+X8rrAEbQzUOg4QkdxUlT2wiFxgvFSVvRbMg+D9XeCbXLdtf8XCsG6caKe6DRDA8BVfWkTOw3EKu7JTps+DTKv/y3KcWu86f223vdUH1G2AoKydUncmLG+JnDdVnWlsavY8COY/jm0O6J3XjSrcJHLBkojuTGy3ug2QqrozQSNQa0Zdiehw4L2IxqYlk0sQBMhFS8LyuaOS8qpFoYYMkpe2h+T0tuDs37ZF3QYITHEAi8gV8E7EAVNWzFdgJ/qpbSG5dENSPr4+KS9eENBzAo1gZaxJ3rI8Ks0ObaZ05m+1gUf9n8+D/yUiN5goV3V7IavgfJCzFobkkiMS8salUVkYqtvLm4ahq9d1R2Vd3P6hqwPq+hHGXhoGCJE7pCtVyVk84Y055MVhn7x7VUw+c1RSTm4N2NLSw274kc7sDOtNg7hRdkrdBgheSDhoxsHHloieBd2x8ybPgRxMSKXGya1BXY28fklEYjbtzLbL+oRPVVkRy9u1Px9n/3YL4eWC7fw2r2ojooNAdtjdm25pxCfvWx2Xf1kbl446GdJCs8R/VBXWeht3nB9MfTyizwFlK9ZEN7EEIXIFRIdVpxMeCm4kX9cdkQ+tTcgaB+cLzIDTFy9eEpWXOLTqarY6DhCPJFV5xwqEyB1QfOQqs3/XHrihPLszJP+6ISFHJ52/czcCC63eoMLjDYsjjs57PFvdBgiCo9nvkYBLHmiiRofao2R/AfJnjm8OyIfWxeWEltoLkTMWhuTvl0dt67Q7F3UbINCiIjtg/aFcRDRnDieIcpwKkQ+sjctRNVSJvKw9KP+0KiYLMIblIu7615is2c/jLoncAu/EkEvGlI9OBuT9a2J6NZPbnaiqJQQeFgS4TV1fXUvT0+K+h5yoMWEeAqMCbvGC1pm7eqxqcqtjm/3ywXUJR/pczYV7H7l5mChV5deDBfnK1rT0Zh2atSOiP4N+WP158xsqGoVaCH2k3rkyLgm/OyqjZ8M8zcc3JOSIhHuH2jzT0w6sq7NIqlyVB8ZKcvtQQR7ZX5T9Ts/YEdGf4BK9JNokr1wYlrM6Q/qu2g27xAtT0/Lt3oxcuzsrFp15dVjwkJzaHpT3rI7JOhfs9TiUuggQvAAemyjJTfvycv9YUVUgNf8jEdUtbJ5eqs/ujuggWRRyfqXLSHFKPrc5Jb8ZLs7+lq2wwOpM9ZggPNCSxe1qPkD68hX5RX9BhUdOhgouuH0gojlBbmBFFPY14Cxvp5enPq5uQi/bOCl7suafnDgXaI54fndE3ro8Kp0uCNW5qNkAQU+d344U5fuq7NyaLuvxVSKqPa0Bj6pEwnLhkoisdHCyGFMzP96bk//sSdm+4bE96JW/WxaV1y0O19TK0ZoMEFQdP9qTk5sH8hyuIqoDWN27Pu6TtyyPyWntQd0M0Qn71Z3o5ZtTeh7VLkckfPK2FTM/NxrA1pKaChA0Y3t4vChX92bk0Ymy6ecrE5GzFgQ9em7kYlWNdDg0jPPI/pJc8uSE5UPi+PFe2haSt6+MuqIxohE1EyAYssIk+bW7M9Kfs/aJJSLnoPg4rSMo/7DSmY6zWGb8Xz0ZPTxu1fElXWGvXLw0KucuCjt2mqAZaiJAhgtT6snMyc/6c5Kx6hklIlfZkPDJu1SInNYRsv1gOOwf++gTE7I9be5kCCbKX9Ye0nMdJ7QEXNMU0SjXB8jefEWuUncDtw8WOGRF1GA6Q17559Vx3Uk3YOP8AK411+zKyjd3pKVowoAHFpihlfxrFkXk1YtCNV11PJurA6QnU5GvbU/L70aKLmjBRkROwLzIm5fF5G+WRGydXN+dq8i/qipkY2p+VQiGq85aGJbzusN6/0utVx3P5toA2ZQqy9e2peXB8dLsbxFRg8GRtG9fEZOLlkYkbFOI4PTEa3fn5FsGqhAUS21Br7xkQVAuUMGxNu63Nfzs4soAeWKyJJ/fnFIhMr/kJ6L6Efd75I1Lo/KW5VHbQmRHtiIffny/7MzMbXMhuq23hbxyaltIzuwIyoaEv6b2dRwu1wXI9kxZPrcpJY9NlGd/i4gaHCah370qLn+rKhE79kygTdK/b0/L9Xtzh5yDRYXUHWmSU1XFgRVka2J+20LOSa4KEKx8+NKWlNw/xmErInpuyYBH3rUyLm9YHLYlRB4YK8onNk7K8Kx9ITieoy3YJGtjPjm9IyzHJH2yMNSkqhDr/01u4ZoAGS1W5UtbU3LboH07QImoNiFEPro+Ked0hmZ/y3S4Nn1y44TcN1rSm/9ag17dJffYZEBOXhDQzSCT6BDZgFwRIOlyVa7akZEbVJnIbR5ENBdLo03yiQ0JObE1OPtbpsJkOvru/WF/SdYl/LrlSqeqPGIqNBpglOqQHA8QjCtix+c3dqSlMLd5KiIi7fhmv1xyRFJWx6xtwlhRl0mcFdII8xqHw/G66/6xgvxgT5bhQUSHDT3xvrcrI5MWnwSFvRsMj7/kaIBgidy3e7N/MTlFRDRXdw4V5Of9eT3URPZyLECylWk9dPXUJJfrEpFxGL24vi8nD3PTse0cCRDMe9yq7hpuG8zrQ1yIiOajLzcl3+nNyCDHwm3lSID0Zstyw96s7ad+EVH92pgqy68GCnrCm+xhe4Bg6AqnCW41uU0yETU2HGv90/6sXm5L9rA9QB6dKMqdwwUOXRGR6fblqvKzvrzeW0bWszVAxtUtwnV78zLJc8yJyAK4stw7WpB72Q7JFrYGyL2jRVWB8IklIutgbvUX/TndgoSsZVuAYHXEjX05VVqy+iAiaz05WZK7RniKqdVsCxBUH1glQURktayqQm7Zl5eRIpf1WsmWAJkoVeWuoYLuJUNEZIct6bI8sp83rVayPEBQQT4wXpJNaT6RRGSfvCo+fjWQkxTvXC1jeYBgOd3dwwVJceUVEdlsm7pxZbsk61geINsyFXlsoqQrESIiO40Vp+V23MCyCrGEpQGClgIPjZW4nI6IHIEb18fVDewQJ9MtYWmAIDjuGytyKR0ROWZffkr+uL/M7hcWsDRAejMVGSyw5xUROQcNeu9XN7IF3smazrIAyasn6/fqSdvPyXMictj2TFn6eDNrOssCBEdMbk6VOXxFRI4bL1bl0f1lnlpoMssCBMNXe3jgBxG5ANbxbE2XJcc7WlNZEiB4jrarAGHfKyJyAxQeW1Nl3RGczGNJgGQqVenJVvQBL0REbrCvMCUD2J5OprEkQLDmersqF1l/EJFbYGHPHhUgnAYxjyUBMlqoygR3fhKRi2BEZEuqrIOEzGFJgPRmK3ySiMhVUHnw2mQuSwJkp3qSChU+SUTkLpifLXIMyzSWBEhfbkovmyMicpOMurHtz3N7gVksCZDJCtODiNwHw1cDhSo3OJvEmgDhBDoRuRB2oqPJK3ekm8OSAOGTQ0RuhMERnA3CS5Q5LAkQzp8TkRthbCQzVdVnFdH8WRIgfG6IyI1QeUyWOAdiFksChE8OEbkVJtI5zG4OSwKEiMitsMaHHbHMwQAhooaCeRAWIOZggBARkSEMECIiMoQBQkQNpUl9eD2zf5eMYIAQUUNBePDCZw5LHkemOxG5VbDJIz4PL1JmYIAQUUNJ+L3is+TK13gseRgt+Y8SEc2TKj4k7mMFYhZLrvU+liBE5EI+HSBejpKYxJIAieFZIiJyGQxdtQebxG/Jla/xWPIwIuGJiNzGr0qPBQEOYZnFkit9d5gJT0Tugwn0pVHf7N8mgyy5zC+N+CTIQUYicplIk0dimEknU1gSIKtiPolwHoSIXGZJ2CchBohpLAmQzpBXJz0RkVtgWH1t3CdhXptMY0mALAw2ybIIxxmJyD0QHKuiPj2RTuawJECaA15Zn/BzIp2IXKNFXZe6wmilSGax5BIfUAm/IsqxRiJyj7Uxv7QFGSBmsiRAYH3Cx7QnIlcIqivduoSfm5xNZlmAtPq9sjrmY8sAInJczO+RY5I+3YmXzGNZgMR8XjmlLaQblxEROWlF1C/r4n7h1chclgUIKo/1cZ+euCIicgqKjhe2BPRNLZnL0ke0K9QkL1BPHFOfiJyyIOiVF7YGdJCQuSwNEKzCOqk1KNwSQkROOSLh1+2VyHyWBggc2+yX9XH/7N8mIrIc+ia+tC3EoXSLWP6oovf+6R0h4YpeIrLbElV5nNLG4SurWB4geOJObQvKYpaQRGQjLAD9K3XzujDEu1erWB4ggPHHl7eHuCeEiGyzKIzRjyAX8VjIlgBBFXLGwqB6Qm3564iowaEP3xmq+lgc5siHlWy7oqM31jmdEd1SgIjISsvV9eb87jBbt1vMtss5Tig8uzMkK2K8IyAi6yAzzloY4pESNrAtQAAnFb62OyKc0yIiq2xI+OWcRWGuvLKBrQGC5/OM9qAcmwzM/hYR0bwl/B75a3WTuoh3qbawNUCgQz2xFy+NqM+2/9VEVMdwg3paR0jOXBjkik+bOHIVf9GCoLyaJSYRmWhZtEkuWhKRJI9CtY0jjzR6ZL1+cUSOTrLFCRHNHzpdvE5dU9g2yV6OBAh0q2f87Sui0smhLCKap1ctCst5HNWwnaNXbwxlXbw0ylVZRGQYjs9+07KoJNkw0XaOPuJ+r0de2x2WszvDs79FRPS8sBjn3StjeqMy2c/RAAFMeGEo68RWLu0lormL+z3y98tjckpbcPa3yCaOBwig2eK/rInJmjjvIojo+WGu44LuiPx1d1iPZJAzXBEgcEwyIO9ZHZPuiGv+SUTkQgiPc7rC8uZlmD9leDjJVVfrl7WH5J9WJbjJkIgO6hWdIXnvqpg+65yc5apnAPcSZ3cG5R9XxRkiRPRnMFJ1WntQ3rsa1wcu3XQD112lfR6PnKfK03czRIjoWc7oCMqH18f1HjJyB8+0Mvs33WBK/atuHSzIN3akpS83NfvbRNQgMM1x5sKQvH9tnE0SXca1AXLA3cMF+XpPWnozDBGiRoO9ged3R+QdK6I829yFXB8g8Mj+knxThcgf9pfF9f9YIjJFS8AjFy6Jyt8uZYNEt6qJAIHduYp8pzcjvx4sSKk6+7tEVE+wnP+dK+PyyoUhLtV1sZoJEBgrVuX6vpz8rD8nwwWmCFG9QVa8oCUgb1sRlRe2Btkc0eVqKkCgVJ2WB8aK8r2dWXlisqwn24mo9uE0wdcsCssbl0W50qpG1FyAHNCbrciP9uTk10N5mSzV5I9ARDKzv2Nd3CcXLY3KX3UEJebjfEetqNkAgWxlWu5T1chP+3Ly2ERJClyoRVRTsNfrzI6QvH5JRFayo27NqekAOWBQJcfP+/Pyq8G87M1OcaUWkcshK05sCepmiCcvCEqYkx01qS4CBDA3gmGtm1SQ/F5VJf25Kc6PELkMWrAfEffLud0RecmCgLTyEKiaVjcBckBBpUZPpiw/31eQ340W9Gqtal39hES1B3Pi6Lh9ZmdITm8PSnuQk+T1oO4C5IBMpSp7VBVy93BR7lVBMpCfkslyXf6oRK6EvX9tQa+sUxXHKzvDcnyzXwcHj++oH3UbIAdgGGukOCUPjpfknpGCbJosy2ixKpW6/qmJnINqY3XMrwIjIKd1BPUKK66sqk91HyAHIEhS5arszVXk0YmyPKwCZZf6elL9Xk6lCedLiIzBsRzJgFfPZxyVDMgLWwKyPuGT9kCTRHwsN+pZwwTIsyEsMMQ1pCqTJycrsj1dlh2Zim6XgjDBhDzbpRD9JQw/ITAC6gsc6LQ86pNVUVQbflkV80nC7+WKqgbSkAHybBX142PifUJVIoP5KRkuTctOFSa92bL+dUoFSlaFTbE6U6VwrwnVO4QEMgAfOG8cgRBVlcQCFQ5dEZ+sVkGxNNyku+NiTgPfY2g0poYPkOeSV0kxWlLhUZ6WMVWl9OWrMqo+I2T25qZUlVJVbzK+Yag+4AKAVzOCA4ERUh9Ybhv3eaVZhUZ3RIWFqjZaAupD/bpVfY2D34gYIEREZAiXRhARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMuT/A80KizI2kDcpAAAAAElFTkSuQmCC",
+ "Label": "Monitoring Solution pack for Azure Backup",
+ "Link": {
+ "Label": "More info",
+ "Url": "https://azure.microsoft.com/en-us/services/backup/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Monitor Azure Backup!",
+ "Content": "## Welcome to the monitoring solution of Azure Backup!\nYou can view:\n\n1. **Backup Jobs** and what backup jobs *failed*\n2. **Restore jobs** and what restore jobs *failed*\n3. **Critical Alerts** that need your urgent attention\n4. **Cloud Storage in GB** view along with **Top 5** datasources backed up along with their storage in GB\n5. **Data sources** being backed up\n\n\n[Microsoft](https://assets.onestore.ms/cdnfiles/onestorerolling-1607-15000/shell/v3/images/logo/microsoft.png \"Microsoft\")"
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Backup Jobs Breakdown (Non Log)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Backup Jobs Breakdown (Non Log)"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#ba141a",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#ba141a"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | distinct JobUniqueId_g, BackupItemUniqueId_s, JobStatus_s, Resource | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s, JobStatus_s, Resource | extend Vault= Resource | summarize count() by BackupItemFriendlyName_s, JobStatus_s, Vault, BackupItemUniqueId_s | order by count_ desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s, RecommendedAction_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s, RecommendedAction_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Backup Jobs BreakDown (Log)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Backup Jobs Breakdown (Log)"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#dd5900"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project BackupItemFriendlyName_s , JobStatus_s, Resource | extend Vault= Resource | summarize count() by BackupItemFriendlyName_s, JobStatus_s, Vault | order by count_ desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Datasources",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Restore Jobs Breakdown",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Restore Jobs Breakdown"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | where JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#007233",
+ "#ba141a",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Cancelled",
+ "color": "#fff100"
+ },
+ {
+ "value": "Completed",
+ "color": "#007233"
+ },
+ {
+ "value": "Failed",
+ "color": "#ba141a"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | where OperationName == \"Job\" and JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" and JobStatus_s == \"Failed\" | distinct JobUniqueId_g, BackupItemUniqueId_s, JobStatus_s, Resource | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s, JobStatus_s, Resource | extend Vault= Resource | summarize count() by BackupItemFriendlyName_s, BackupItemUniqueId_s , JobStatus_s, Vault | order by count_ desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | where OperationName == \"Job\" and JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" and JobStatus_s == \"Failed\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | where OperationName == \"Job\" and JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" and JobStatus_s == \"Failed\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts from Azure Resources Backup",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Alert Distribution "
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s | where CurrentStatus == \"Active\" | summarize count() by AlertSeverity_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#008272",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Critical",
+ "color": "#e81123"
+ },
+ {
+ "value": "Warning",
+ "color": "#fff100"
+ },
+ {
+ "value": "Information",
+ "color": "#55d455"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project BackupItemName_s, AlertCode_s, HitCount | order by HitCount desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "HitCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts from On-prem backup",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Alert distribution"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join kind= inner (AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s | where CurrentStatus == \"Active\" | summarize count() by AlertSeverity_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Critical",
+ "color": "#ba141a"
+ },
+ {
+ "value": "Warning",
+ "color": "#ffb900"
+ },
+ {
+ "value": "Information",
+ "color": "#55d455"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s | where CurrentStatus == \"Active\" | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project BackupItemName_s, AlertCode_s, HitCount | order by HitCount desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join kind=inner (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, BackupManagementServerUniqueId_s, ProtectedContainerUniqueId_s ,lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | where CurrentStatus == \"Active\" | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | join kind=leftouter( Events | where OperationName == \"BackupManagementServer\" | distinct BackupManagmentServerUniqueId_s, BackupManagmentServerName_s | project BackupManagmentServerUniqueId_s, BackupManagmentServerName_s ) on $left.BackupManagementServerUniqueId_s == $right.BackupManagmentServerUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, ProtectedContainerFriendlyName_s, BackupManagmentServerName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join kind=inner (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, BackupManagementServerUniqueId_s, ProtectedContainerUniqueId_s ,lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | where CurrentStatus == \"Active\" | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | join kind=leftouter( Events | where OperationName == \"BackupManagementServer\" | distinct BackupManagmentServerUniqueId_s, BackupManagmentServerName_s | project BackupManagmentServerUniqueId_s, BackupManagmentServerName_s ) on $left.BackupManagementServerUniqueId_s == $right.BackupManagmentServerUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, ProtectedContainerFriendlyName_s, BackupManagmentServerName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Active Datasources Protected",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Last known Protection status"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s, BackupItemProtectionState_s | summarize dcount(BackupItemUniqueId_s) by BackupItemProtectionState_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#ff8c00",
+ "#55d455",
+ "#6dc2e9"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s | summarize dcount(BackupItemUniqueId_s) by BackupManagementType_s,BackupItemProtectionState_s | order by BackupManagementType_s desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "BackupManagement Type",
+ "Value": "BackupItems"
+ },
+ "Color": "#ff8c00",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, Resource | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, Resource | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Cloud Storage in GB",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Cloud storage in GB"
+ },
+ "LineChart": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend CloudStorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project CloudStorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s == \"Cloud\" | summarize dayCharge = avg(CloudStorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d) | summarize TotalCharge = sum(dayCharge) by bin(TimeGenerated, 1d)",
+ "yAxis": {
+ "isLogarithmic": false,
+ "customLabel": "Cloud Storage (GB)"
+ }
+ },
+ "List": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s, StorageUniqueId_s | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | project StorageInGB, BackupItemUniqueId_s, StorageType_s | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project StorageInGB, BackupItemFriendlyName_s, BackupItemUniqueId_s, StorageType_s | where StorageType_s == \"Cloud\" | order by StorageInGB desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "Cloud Data in GB"
+ },
+ "Color": "#eb3c00",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s == \"Cloud\" | project StorageInGB, BackupItemUniqueId_s, StorageType_s, TimeGenerated | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project StorageInGB, BackupItemFriendlyName_s, BackupItemUniqueId_s, StorageType_s, TimeGenerated | where {selected item} | summarize dayCharge = avg(StorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d)",
+ "NavigationSelect": {
+ "NavigationQuery": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s == \"Cloud\" | project StorageInGB, BackupItemUniqueId_s, StorageType_s, TimeGenerated | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project StorageInGB, BackupItemFriendlyName_s, BackupItemUniqueId_s, StorageType_s, TimeGenerated | where {selected item} | summarize dayCharge = avg(StorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d)"
+ }
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "SingleQueryDonutBuilderTileV1",
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#e81123",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#ba141a"
+ }
+ ]
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "westus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT655 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT655
new file mode 100644
index 0000000..b803093
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT655
@@ -0,0 +1,729 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-oms-monitoring/azuredeploy.json",
+ "/demos/backup-oms-monitoring/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962898696,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-oms-monitoring/azuredeploy.json",
+ "/demos/backup-oms-monitoring/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT655",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT655",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceLocation": {
+ "type": "string",
+ "allowedValues": [
+ "centralus",
+ "eastus",
+ "eastus2",
+ "northcentralus",
+ "northeurope",
+ "southcentralus",
+ "westcentralus",
+ "westeurope",
+ "westus",
+ "westus2",
+ "uaenorth",
+ "switzerlandnorth",
+ "uksouth",
+ "francecentral",
+ "norwayeast",
+ "koreacentral",
+ "australiasoutheast",
+ "australiaeast",
+ "japaneast",
+ "centralindia",
+ "southeastasia",
+ "eastasia",
+ "chinaeast2",
+ "canadacentral",
+ "brazilsouth",
+ "usgovarizona",
+ "usgovvirginia"
+ ],
+ "metadata": {
+ "description": "Specify the workspace region"
+ },
+ "value": "usgovvirginia"
+ },
+ "workspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specify the workspace name"
+ },
+ "value": "GEN-UNIQUE-10"
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure Backup Monitoring Solution",
+ "solutionName": "[concat('AzureBackup', '[', parameters('workspaceName'), ']')]",
+ "publisher": "Microsoft",
+ "displayName": "Azure Backup Monitoring Solution",
+ "description": "Monitor and analyze your Backup Vaults",
+ "author": "Microsoft"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "usgovvirginia",
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "Azure Backup Monitoring Solution",
+ "type": "views",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "Azure Backup Monitoring",
+ "NewGroup": false,
+ "Color": "#00d8cc"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAgAElEQVR4Xu3dB2ClZZk24OecnF6TTJLJJNP70EEEFRRkERQFXFQW1rWsZXV3de2/uoB1BTvruqwN112wAoroIiBNROlKnZ7JtGTSM8npLSf/e79hBCMzZL587ZxzX/vHZCbzM5NTvvt73vK8nmlFiIiIDpN39m8QERHNBQOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgMYYAQEZEhDBAiIjKEAUJERIYwQIiIyBAGCBERGcIAISIiQxggRERkCAOEiIgM8Uwrs3+TiOrflHrnp8pVmaxUJVeZlqz6PFyclv2lKfX1tOTUHyhWp0X9Pymry4TXI+L3ePSHT916RtX/JP0eafZ7ZUHAK5EmjyTU57j6HPfz3rQRMECIGkDh6TBIqZCYKFVVSFRlX74q/fkpFRpTMqY+surPTKpAwZ9T+SFTVYTMzOXhwEVCZYgOEo/MhEhA/SKoPhK+mdDoCDVJuwqR7ohPukJeaQ4gZLwSU6ESVB/481Q/GCBEdaii3taoKjIqFLany9KbmZK+fEV2ZisyWJgJi9LUTFCoTPlTQMyXygj9gXBBsCA8OlWoLI/6ZJkKlVUx9bX6jOol6mOY1DoGCFGdyKtAGFeVxYAKiMcnyvLkZElVGaq6KE3pMCmqoMBwlBMQKsEmkbhvZrhrmQqUE1uCskYFCgImqX4PgUO1hQFCVMMwj4Ehqc3pkjy6vyyPTpR0lZEqT+vvuVlQVSkIjrUxvxzXEpCTWv2yQlUnnD+pHQwQohqDN2y6XJUdKigeGivJQ+NF2asqDUyIq+KjJoVVddKqEgXDXC9rC6lA8cti9ZsxjIWRazFAiGoE3qhjxarcP1bUH4/sL+lfu73SOFyqKJFOFR4ntQbl1AUBOV5VJ5hLIfdhgBC5XKk6LftUafH7kZLcM1KQrZmyqkBmltfWM8yxJwMeOToZkLM6w3JCs186gk16FRi5AwOEyKUQELtzFbltsCC/UcGxK1up2SGq+Yr6RDbE/XKmCpIz2oN6uTA5jwFC5ELYn3H3cEGHx3ZVcTRqcMwW86Ei8ctruiJycmtA2jATT45hgBC5yGixKveMFuXGvpz0MDgOCkFyXHNAXr84LC9oCXDllkMYIEQugJ3iT6XK8sM9WXlwrCjZyuw/Qc9lQdAjL+8Iy98sCcvKqF/vNyH7MECIHIaNfz/Zk5Nbh/IymK/O/jY9D2TGyliTXNAdlVcvCun2KWQPBgiRQ7C66r7RovxAhccf95fqbjmu3TCvfnpHSC5eEpFjmgM6WMhaDBAiBwyrquP6vrzctC+nvmbVYaYVqhp549KonL0wxLkRizFAiGz2xGRJvtubld+p6oNVhzWw7PfszrC8ZXlU724nazBAiGyCifI7hgvy3Z0Z2Znh8iqrYcMhNh/+w6qYvKAlyAl2CzBAiGyAPlWY6/jRnqxudEj26Qp75W0rYnJuV5gdf03GACGyGDYFour41UCe+zoc0hzwyEVLovI3SyLSwlVapmGAEFloa7os/7E9LfePleq2dxWGhjBX7fZwRG68RlUh/7gqJu04nITmjQFCZBGczfEf29Lqc3n2t+pKW9Ajr+yMyJ5cRS8McHNQIuzO6gzJu1SI4GREmh/WckQWeGCsKF/Ykqr78IAmj0fO6AjKJRsS8qpFIX22h1th1dutAwX5yta07Mpxu/98MUCITPZ7dRf+5W0p2ZJqjAvU1DSOy52WhaEm+cjahLx9ZVy3GHErFEj3jhTlSyrgMcRIxjFAiEyEyuPK7SnpSbt8QsBk5afHrdBG5M3LIvIBFSTLoy4uRQRBX5Irt7ESmQ8GCLkShhrQ6iOvvshUqvoIV3xgOeyBr/GRrcz8GfxZp4fecULgV9QFqdHCA55dbwS8HnnNorB89qiknNIWcPUBUA+MleSrW9P63BU6fJxEJ8fh7hWb7Arq834VCjimdUh9TJaqKjymVUhUpfL0qxRNP3A90h9Y/aP+B6294z6vJNXdb3vQI4tCTRJt8kqoySNYbOPDH7TYlnRZLt+UkicmG29IBJPonzwiKS9tD83+ll7CfM3urPyiP6eCfvZ33eMVC0PykXVxHlR1mBggZCtUFgiEjPpiQF1RBgpV6c2UpTdbkZHClExUZqoKVBQYFcHHs9t9HPgSkYCv8Rkra2Y+ZgID52fHVIAsCjfJiqhPf2Az2UL1zZgKmgjOSjURhkCuUOHx4Hhp9rcawqECBHLq+byxP6+CJCNDLu37hSrp/O6wvH9NnOevHwYGCFkOL7CMqiwGilPy5GRFNqfKslOFRp8KEAw/ofooWXRdwQ0ldh9HVWgsV0GCMyOOSfrlSPXRqiqW8Dz7W4yrf/jnt6Tk14OF2d9qGM8XIICbgHtHCnL1zqw85dIqDfcVb10elbevjM37ddEoGCBkGcxXDKrQeHyiLA+ru/NNKjjGS1OifsuxJoK4SKACwYohHI364gVBWRf36Y1lh3vRQKX07d6Mbk9iVQDWgrkEyAEY6vvWjoxeqebGxyzh98g/r47LGxZHXD134xYMEDIVgmFEJcRGdZd590hRd54dVb924xwlrg+4YGCo66SWoLykLSAbEv45DWHg5/zxnpxctSPlyp/NTocTIIDXx3V783JdX1YmS+67/CwKe/WellPb5vbzNDIGCJmiol5Gw8WqPiDptsGCPs97ouT8yqi5QmagR9KJLQE5oyMkJ6jPGOI6GKy4+uTGCenPufA22maHGyCAocubB/LyvV0ZVz6GGOb89FFJPX9GB8cAoXnBnXhfviJ3DyM48no5ZK3fkSdVVYIT7c7uDMkLVZBguOvZejIVvcscw3JkLEAACyT+OFGS7+zI6EB2aljzYF7TFZIPr03wiNxDYICQYftLVblLBcfP+3OyXVUcbm+md7iwPBiVyIVLwnJ8c1BPxOPOGbvMf96Xd90FzylGA+QArGK7ujcrt6sbkKKLihG0ZHnP6oRctDTCs0QOggFChw0b+HD3fYMKjsfVHWS2xiuO59Ma8MhpHSG5cHFEtqQrcqUKEJ7p8Yz5BgjgZgRLfTEvMph3T4p0hr3yKfWzvWhBcPa3SBggdJgwRPXDPTl9tzjuwglQq2BFDiZXVXbKSKFaM3M7djAjQAAV3R1DBflWb1p6XXRi42ntQfnUkUmeI/Ic+IjQnKCdyP8NFOSyJyfl+r25hgoPwHg9JnuHGR6WwTAR5p0+rS7WL1MX7TkshrPFg+NF+Vk/hyyfi0ueInIzLLv8xo6MXL55QrfqcPN5D1T7jk4G5NINCb0Xww2t4TG3d0NfVu9hoT/HAKFD+uP+knxmU0quU1VHra+uotqBnlQ4OfB9axJ6HsJpmJfBewCbR+kZzj8z5Eo43+HWwYJ8atOkPjsBY/9Edor7vXLhkohctiEpxzX7Z3/bVoiN34wU5LejxdnfamgMEPoLaH6HXdb/vi0le7LumcykxoPFC6e0BeXjGxJy5sKgPtfcKdg1f2NfTobrbb36PDj4dJAbYTnld3Zm5Js70jLo0s6p1HjWxf3ysfVJeduKmKOnHWJI99dDBc4DPo0BQn+C8PhWb0ZVH1lXn91A7uL5s+OkrNMW9Opuudjc1x1x5tKFKRAEyDA6ghIDhGZgpdV/9qT1El2GBx0OzJfZtcQVh4Sd3xWWy49q1s0vndghvi1dllsGCvrMmkbHACF98t93erPyy31c605zgz0aWGKrT4P0e/TpkHbBvMixzQE9L3KOChO7DxHEFMgdQ3kZ4FwId6I3OixLvEpVHj9RlQfDgw7AnT1CAscB45yUmAqJJI4NVr/ZFvLKAn+TdKjPzTj9UYXI2rhf79S2MUe0yXJVft6fl2t3Z2S0aN8LGJP5WGJ88dLGPjeEAdLAMPTwg905VX2kOWzV4HDQVqAJVYVHukI+WRnzSXsAYdEkS1SpgTNTWlVY+NXVEuHiezpc3AA3PrcPFeS7OzOyPW3fZqUTWvzyxWNa9NxMo2KANLAb+nJ63gPndlDjwGUfwz7YZ9EWmDk7Hquc1qrQwBkoLeqCmGjyqkDx/KkKcTu8gnHiJU47vH/Mnn1LaPv/0Q1JeeXCUMNWIQyQBoX+Pp/ZNOnKw3zIfLjARVQgYNgJpy6uic0Exmr1EVPlRLBpprKoddij8YM9Od16xI4u0dibcsmGxm20yABpQDi74/JNKXl0gr196hmqDMxZdKkvcEDW8c1+6Y40qapj5vx3rGiqR5jXw4KQa/dYf9phpwrky49u1ufGNCIGSIPBWR6Xb0npZYhUfzDkhIltDEkd3zITGssiPn0YVr0GxnPBvMgf9xflqp6MPGbhjRIe0jcvj8q7V8Uk2IDjWAyQBoI31c/6Z1qU2FHekz1wEcN4/FIVFCe1BuXE1pnQQPXRSKHxXLapavu7vVm5Z6Rg2YmZRyX98uVjm1U1YvN6YhdggDSQR8aL8ulNKdmbs+idRLbCPgxMgJ+sQuPFCwKyXlUdOL870IB3woeCfU7X9eXk+3uyup+V2ZIBjz618OUd8ztQqxYxQBoE3kT/tjmllztSbWtWF6zVMb+8tE0FR1tAloR9ek6DDq6gyu9bBgtyze6M7DT5tEMsgX7jsplhrEZ7HhggDQAdFzB09eWtKcvKeLIWLksLQ149GX5OZ0iOSPilNeitiSW2bvLEZEm+uSMjD42VdF8rsxyZ8MnlxzTrocNGwgBpALtyFbn0yUl5atK6yUSyBuKhXQUH5jbO7wrJWlV5JBt0yahZ+vIVuWZXTlUkecmUp005ohgdgj97JPpzBWd/q64xQOocSnccR/vDPVlbNleRebBn46XtQTl3UVhWRn2ScMsh4XUAS33/byAv39qRlnET5kWwGf1Ny6LyzgZbjcVXZJ3Dno/b1J0Ww6N2tAQ8cl53WK44ulk+sjYhxzUHGB4mw7LmpZEmvYHSDMUqhsfKuqJpJHxV1jH0uvq/gYIM8WComoDh85d3BOXTRyblQ2vj8oKWQMMvw7VCXlXlv9iXl69uS8uwie8NDI2NlhprkpEBUse2psry25GCKWO8ZB2s4jmxxS8fXpfUy0Ff1h7SezjIfGh1gs2FX9yS0o0XzexAnVLVx47sVEO93/gqrVO4y/rVYMHUOywy36KwV/5uWVQuU1XHa7vCnCC30BZ1Q/WVbTi6ICsZM5dgPQ0V/+5sRcoNdNAUX611aneuIveOFky9wyLzYNPyy9qD8lkVHNg/gOWfDTT3aiu8B+4aKsilGyfkNnVTZdV8IP67PZmynqBvFAyQOoQboAfHSjLK6sOVFkea5F0r43LphoSc2BrkPIeFcODU93dn5YvbUtKTtn5+oj8/JfutSigXYoDUobHSlNw1XNArQ8g9MDp1mqo6PqWqjjctj0hHA/ZOshOOnP3a9rR8c0daBvP2vBkmVHjsL9nzd7kBA6TOoPp4fKKsNw+Se2BPB/YJ4BzvE1sC3EFuIQwgPTxelM9umtTH3dp52ib2XSG4GmUQiwFSZzKVqjw4Xmq49ehutj7hk/+3LiHvXBlryI6tdjrQ8wp93+4bLekbKjvh79+ZqUixQSYfGSB1ZlSVz49OFDl57gJYiYsT6zBkdebCEOc6LIaho+/uzMoXt0zK7qyNZcezYPpjn6pAsCKrETBA6kxPusKNgy6AVusXLYnKR9cndJt1slaPuuv/6va0/O+ujEyY0JrEKNy4Tagga5R5dAZIHUH5/OD+YkMtI3Sj9qBX3rM6oZfntgcbY8jKqVccLtj3jRblE09NyC/78+KG+eu0ev+VG6TFIAOkjqQrVdkyWbZ93JeesSzaJB9al5CLlkZ0v6V6gos1Nqim1O31aLGqT/v7vbp43zFUkH15+yeO8W+5vi8nn9syKZtS7lk0glWQmItsBOzGW0ceGi/KpU9Ncve5Q3AmxL+sjcsLW4I1vylwJiyqupqdVBdD7CnqzVakTwXFcHFKD9NgvwM+R1RQYpEAWrDY9WOjJcn3d+fkp/1Z1x3PjNbuVx7bos9uqXcMkDpRUmXHD/fk9Jp3HhplvxNa/PJ+FR7HJGvzooGqNacCAy0+0MUAp/YhMPAxUKjo4VHc8aNX4OwR0oTfoxtA2nWk6xMTJbl6Z1YPXc3+t7gBjri94qjGOBuEAVIn0upu8Os9GblBlfQcwrLXya0BeZ8KD5wSWEvQswnj9egguzVVkUfVhbk3U9GriDAEowqNOa3ma1N33J88Iikvbbc2QLCyCaHx7d6MbHbRkNVsMVWRXaYej7M7rX083IABUifQQuHSJyfURYCnDtoFw1QID8x5rI7VxlGmqFTRNRZVBjacPqZCY0e2LJOlaT1cZeRiYEeAYN7lJ3tzuhHiaNHIv9I+WIH3sQ1JOb8rPPtbdYeT6HUCPX+GcMtItkF4YNiqFsIjp8IBk97XqYvwZzZNyiVPTag7+bT8dqQo/bmZoSu3XpZxc/Sfqrr+750Z14fHAY3SkZcBUicwmZmby3gDmeIFLX754Lq4rHPxHg9cxDAchQ60X9iakg8/PiFX9cyEBnpDuX2uDC/nB8eLcpkKOwzN2tmSZD7wLnTj3IwVGCB1AG+0PnU1wPDE4cDGaHxgxzQa/eFcZ3zGr/Fx4Pt2raypFcck/fLeNXFZE3NneOD1sDNbkZ/25eWyJyfk3zZPyk39edmTnaqZizDCD2eWX745JX/cX3tL0zExUGP/ZEM4B1IHsDoGXUd/vCf3p997Jgg8uoVGVH94Jeb3SLP6RtTnlYj6vaD6Pv4cmvupb+sXPtpo4WWB3bSV6ZnVN4XqzGe9rLOMu9dpPamJ38NnvOH1n6/W9xtnZaxJLt2QlBNa3LfaCs8JmmjePVyUO4fz0p+zJzDMngPBHhMMtV3fl5X9Du4qNwrtzt6zOi5vXBat+5svBkgdwATjFVtS+vjaReEmWRn1693QC9UruSPYJF0hr7Spr0MqLLAv2qc+YwJYf6hfozGs51kv9QOj4XhlYEfJgbupKfUF7m7xgcDIqi/GitgXMC1Dhaf3B6h/y4C6amE+BivD8GfdPlQyV3hMP7wu4brVNbg778mW5fbBotw2NBMcdo5mmhkgaEmCVVY4AKpWh4Fw8/auVXF56/KoruDrGQOkDuDO88nJkv7cHfFJqyopAiodfE9XIFa/hnEBQ+sGVB8V9YsMgqU0pcIFE/tV2Zwqy65sRS8XRZdgzNXUWq8g7HX4Z3VXeUF3WD+mboDHfV+hIrep4LhlMCd7s2jiN/tPWc+MAMENyQNjRb2/A6vDahleHeeq18nH1yckXOcJwgAhS+Eih2DDEBgqlO3pimxTH1g6ik1qk6WqLcMs84EhPpxbjt5WGPJzA1R3tw8X5Ya9WdmewTncs/+EfeYbIFgh9tP+nFyzKysjTiSgBdYlfPLlY5tlSdj9K/TmgwFCtpoZ0sIGtqpenomL3x/GS7I1U9btuFGhuOkFibg4qzOkl+sucsFZHpiTekzdoeOgpHtHCjLpgnNf5hMgg0+3JPm5ChAsJa4XaGfy8fVJOaMjVPNtbQ6FAUKOQoWCXc84x+SpybLeDY3hOLsmgJ8PVlxdfkxSFrvgThIX21sGCnJdX1YGbDqidS6MBsjj6rn+Vm9GHhwr2TpnYweMXJ3XHZYProlLHCVsnWKAkGvgIpJ9ujJ5SFUl948VpUdVJuOlaUeWcTYHZu4inZ40x8++MVXShyWhYabbTis+3ADBcvN7RjDfkdEtVOrVC1sD8rmjktLhgsrVKgwQciUM1aDlxrZ0WV9ssKEMLcPtWtEVVQXH21bE5c3LIo5OmmOF3c1PVx1ocOhGhxMgWFhxXV9OblA/z1iN7Co3CkcZf/34lro+E6Z+ayuqadiX0hrwyosWBOV9a+Jy+VHN6oIe0y3TseHRai9Wf+/rHF5xhf0QGOL5ek/KteFxOHRLkh1p+R9VedR7eABWG2LYsZ5/UlYgVDOw1HOwOCW/HS7JHUN52aKqEyvmSbojXrni6GZHW7MfmB94aKzk+v0Qz1eBYGjyYVVBfkf9PFgAUG/zHQeDeZA1cZ+8qjMsL2kLyLKITy+vrycMEKpJ6PF0+2BBbhnM66XBZl2U0En13avi8qZlUUdWz+DHQMtydBbAcudacKgAwXwHhuDQuNFNE/92QpCsjPnk3K6wvGJhyBWr+czCAKGahYvTXlWC3KouUL8emun1NN8XMybMP7Y+IS3YTmwzzPv8cl9Brt6Z1h1ya8XBAmSk+MwSXTcsN3Yabk7Wx/1y4dKo7uSMIdpaxwChmofqA5PtP96bkzuHCob3EywKe+ULxzgzdIW9MTfty+sTJWut/xMC5BMqQHCk7QEYXvzezqzcrp4PJ1bQuRmCBKcVYnPqseq15kSla5baj0BqeBgi2JDw6zX3l6gL2THN/sPuQYSJ+XM6w460Z0d44LCk7/TWXngccOAiiHmq348W5bMbJxkeB4F5uzuHivJp9Rj9r959b8FEnk1YgVDdwfzIT/bk5Jf7cnoPyVxgkvOSDUnpxu2hjdDNGOFxdW/GcOXktI6QVz5/dLMcmfTLj9Tj/sM9WRku1M4QnJMwioWVhm9ZHpXjm2uvGmGAUF1C2/nfjBTl2t0Z2fI8m9WSfo98XIXHWQvtbTuBORyc2YE5j1pe1rpQBcg7VsZ0aGC/Co7HpcODYwLevDwmZ6vXYC01YGSAUF1Dw0YchXrHUOGgmxCxMuYTRyRsbTmBeRv0s7qqJzXnKsmtfOp6F1chjArKyaaOtS6mHsjzusIqSKLSWSMrtex7xxA5YGXUJ+9fk5A3LYvpSmM2tCt59aKQreEBvxstyH/vStd8eABG3jB3w/CYHwQwDtK6cltanyhZC1iBUEPAqYl3Dhflu71p2fH0rm6MFLxhSUTvdLdz2AANIz+7aVJ662B3OVnj2Ga/vHd1TE5sDc7+lqvYe9tFroSVMhhSOfBRj3cUOMfjVZ0h+ci6hByRmOms2xb0yjmd9o45o7XFN3oyDA86JByq9cWtaX3IlpuxAqlTCAIsqUQ44O47OzVz1gYOdsIBPpjALVVF/xpfYxgCrwRMIuPIW5yhHvLia9FH4UbUF7jQ6rPV1de45uJ76FlVax5TFcDXtqVlVXxm6W8Eg/g2mFAP+Nd60nJjX372t4ie04pYk7x3VVxevjBk+cmiRjBA6gT2EmBJaF6FAbrWYgwVn9MqGUbUXe9ocUpS6muECf4sdj3DgXX6z34VzJyRPvPZq75CM9Fwk1cFh0da/DNnrSd9M5+XRb2yNOJTwTITMGGf9UfomqEvXxG/+gHRKdWOlVd4brCxDud9A+ZIEb4zIYzhtGfOqUe1hCaOCHocFYznBs8Xjgw+cGOAwDerfQu52+JIk3x4bVxO7/jLVjFOY4DUKIQAWn0PqHDYV6jKllRZtqbLMqbucnHa34EqQ59TbvIzrKsPz8x567h7x+oRBMuqmF/WJ/yyNOyVLhUqzahaaiRQrIbmiP/Vk9HDg6tjPlmggmtB0Cut/pnqLqYeVJXBKkA8em8AHjNUiAgOVTyqCnJaH/+LmwDcDOD0xiH1eUg99zh/Hs/3zM3B7L+Z6sHyaJP8v3UJvYPdTRggNQR3seOlmbBAV1O079iZq+gT/bCZ1ek7Ulz0cGcdUhdDnOC3NuGTIxMBOb7ZLwvUVTFh80ont8Dzgos9nr829Tjg8UH1YXTqBf89BAsqEazcwU5mnLPRk52STamS7M1N6fPn8/omYvb/b6pVq2JNctkRSTmu2f5WOwfDAHE5XHRG1R3m5smKPLK/JE9MlvQFI112/8UBVQqGvTBZvVpVJ6eou6e1cZ90q5Sxe9ms0zBUaPVQGapSnEGBCrQnXVEVaUW/XnarmwzMv1jR+p7shZuxTxyZlBU48cwFGCAuhCcEwxQ9mYo+jQ+Tvno+Q4VGLT9ZeM23Bprk+JaAPrAJbwbMQRi9E6dDwxAmXjM4Q+VJVbHeN1bUVSuGv4ouv/mggzu9Iyj/uj7hiqNyGSAugjFsLPP8w/6yPjAJAYKhCaeHpsyGwIj5PbJKJcpp7SE5sTUgKyI+21ZDNSIMd6GlOqqRP6pKFg0Pd+nKpM5eXA0AxfvfLo3Ku1fFbF2C/lwYIC6AoYe9+Yru0HnXcEH61dc1shF13nAThcnkl7aF5Ex1Z3VkMuD4m6LeIUyw2AJzaXcMF1WgFHUfK7MXW5B1UM2/b21CXt8dsXxo9FAYIA5CcOxRYXHbQEHuVMGBYSq3z2tYBW+CdhUkOFPir1SQ4EwOViTWS5erul8Ybl5+N6ZuXnJTHN6qEUsiTfK5o5OOnF9zAAPEARiSQpVxU39e7hopSJ9607KP0AxERnvIK2d0hOQ1i0L6fA4sFyZrYbFGv7qBwYFcd6vX5M5MhUFSA85YiPmQpF6o4gQGiM1G1bsSnWFxVsUWE8/yrjeIjG51h3XuorC8UgUJlgVzZMt6GN7qQ5AMF+WWgZzs4c2Nq2EI+B9WxvV5Ik68PxggNsEE+e9HinLjvrw8Ml7kkso5wqa6NTGfXLAkKmd1BBtu+a9TsM9kV3ZK3ejk5ZbBPA+IcrGusFcuP7rZkf0hDBAboK0Izn64SVUdXPViDCYN0crhDYsjcnQy4MjdViPCUmDsor9pX0HuHSnolVzkPq/uCumd6kmbb7AYIBZC1fGb4aJcsyujN3Vxlcv8LY02ycWqGjm7MyStKE/IFphsv2e0JD/ry+pOsRx6dZeE3yPvX5uQv6aembgAAB7uSURBVO4O29o6iAFiEUxI4nCYwzmXm+YGx5ZjtdbbVkT1JDvZB+fNX69e1zcPcFjLbY5O+uULxzZLl40bDBkgJsOdGQ4Muro3Iw+Pl3inZqENCZ+8aXlML/tFB1uyB5afYzPiNbuz8oh6jbOydgeMXr1ndVzetCxq294QBoiJ8Ma6ebAg/7srI3uynCW3Q2vAIxcvjcqFiyOS5JCWrQ5U2TcP5GS0yMuIGxypbqo+r6qQJWF7emUxQEwyjNK+L6/eUFlONNoMFfsrOsPytuVR1zSZaxSY57t3pChX78zIdi5LdxyGd9+xMi5vXhaxZf8UA8QEGBf++va03DVU4OYrB72wNSDvXxtXd2GcF7EbzqL5wZ6c3DaQ53vAYetVFfKVY1ukG2liMQbIPD01WZJv7sjK70bdfXZxo1in3jzvXR2TFy8IcamvzXDg1Y/35uSn/TlOsDsIcyEfWZ/QS96tfgtw0HgeMJH4hS1phoeLbE1V5PPqObldVYMHjusle2AO6u9XROVDaxOyLGr93S89N3QOuGe4oJdeW40BYtD9Y0X54taUPDlZnv0tchh6i125LSU37cvr1hxkn4DXo/foXLIhoYcUyRnbMxXZlLL+2sQAMQBnKXxJhceWVIP0XK9BOCv8qp6ZEOHErv1Oag3KpUck5OUd7jrDu1GMF6v6MDo0ybQSA+QwPaAqjyu3p6Q3w2W6boelpd/uzcgvB/K6txPZa1nEp8fiz+8O655mZB/szfnD/pnjr63Ep/UwPDRelK9sS0tP2tonhcyDydxv9KTl1kFn50TwVyPE9LnlFRw1W9WTzjhedlx94MzySfV7WfU93DVieazFN4+2wK7oD6yJy4VLonq5NdlnT64iT05aO0rCVVhzhNPbPreZcx61qjvilY+uS+gWKFbCRT8/VRXc+GXUZxxJjBb+GfUNhAU+cur3ESSY4yw//fbDijGfxyMB9UVUfcTUR2uwSfc4Svo8+ux49P7C2n6c2BiqsSVmCMdrdmXlx3uzDXPaptPwCnnDkoh8cG3cstcLA2QOcHb0FZtS8uB4afa3qIasijXJx9Zjcte8cfkDgbFfXSBHVLWzLV2R7ZmyPl1ySKVIRlUURfWHUH3gzyI0UAkd6k2H/V8zgaI+1C9UhugLwCJ1C9+sQgRDQ2vjflkeVaHi96qQ8Vp2gTATKqtrd2d1pwaGiD2wJ+TK41r0a8cKDJDngeGFr25Lya8GnB0CIXMc2+yXTx6ZlJXz2LGOl0FKvS4GVUBgtctTqirdpD4QGOnKTPVh5fATDp9DYGDZ7NKwT/9M6+M+Wa1CpVmFiZvPlM+ox+d/dmblB3uyPBPHBh2hmbNCTmyxZkUcA+QQME79jR0Z+cnenKUXBLIXVgZ9XFUiHYd5V4aL36CqMv44UZKHxor6REkMzWBOw8nXB36MyNMVytHNAXlRa0DWJfzS4tLKBI/X93ZlVTWSkQJDxFJ4bbx9RUw3WLTitcAAOQhUGzf25+Vr21OSYm+ruoKdun+n3lDvWhmb05sKk92b0mW9LPLh8aIennLr3TN+nLjfI+tifjmlPSintgX1RPZcfk474TH9j560PmjNyfBtBGdhX466YbKi2SgD5CDuGy3KFVtSsjfn0isFzUvEJ/oAntd3R56z9TUuasPFKd2u/NbBvB6qwoR4LV3s0AqpS/0P5nxesTAk6+I+ifnMv4gYhcfz31WI3Lwvz+FhCx2R8OlzQqzo0MsAeQ5oU/3Jpybkkf1ccVXPcLrh5Ucl5ajkn48Pp8pVuXO4qA9N2jhZcm21cTgwFn56e0jOWRSSDQm/a85PQSPSz2yclAfGuEDFKu1Br3z6yKS8pM28xSMHMEBmwfjs19VdEc45qKW7TTLmZe1BuXTDzHwIguN+dSH7xb6cPDFZlnSdDV1iFGuRqkhOUReS87vCsibms6Xl9/N5UoX0FZtTsomdHSyBSvQD6w5ebc8HA2QWtL748tZU3V086LnhovqW5VF9d4aK47bBvLqJmP2n6s/iSJNcoC4o53aF9B4Tp/1utCCf2ZRiF18LYM7vrctj8o6VUdMrTwbIs/RkKnLpUxPscdVgsKIXeymw4c+GBqaugTvT41sCcvGSiJzYGnR0+S+aXmK141Wq+q+HIUM3wbP6qkUh+Sgm0pEmJjL3v1bDsMnph3uyDI8GhE1tA/nGCg/Ahfq+0ZJ8YuOkfHNHRgYdXFOLobTXL47I+RYMszQ6VAhDhZlNrWZjgDwNx3L+dqQw+7eJ6t7+Eu7+s/Jvm1L6jBunVkRhqfFFSyNyVJInSpot9XT/NbMxQGSm6dg1u7O6eytRI0LxgYPRLts4Idf15fRiEicsj/jkn1bFpCvMS5OZMMKCfmxma/hnCY/p7UNF3SyRqNH156ryXz1puXpnRjd+dMKJrQE5ryuiJ3/JHFPTaN7JADEdGt/9cl9O988nIuyDmZbvq4r8C1tTstOBrofoSnxBd1hevMD8fQuNCjfKkxasLG3oAEFL7Zv3FbjbnGgWFB+3DhT0yZtOhAj25Vy0JKI3wdH8VVT1gbNmzNbQzw7ODL5zmL14iA4Gq7Qu35ySxyfs3ymOoazXdnMoywwYjOQQlolQfdwyWNDdVYno4B4eL8kXt6RsnycMeD1yfndIVsXM7+HUaBAdJQu2/DVsgPRkynLfGM/4IJqLjamKPs55o80hsijkk/O7InrTI82PBfnRmAGC6gMrrwbzrD6I5gqVyJe22Dsngs3xZy4MygkWHYjUKLA3E4sTzNaQAYIjau8bK3Lug+gwPTZR1rvWR3Dsok3agk16LgTnnJAxeOSaLLjaW/CfdDdMJN09XJQ9Nt5FEdWTO4YK+qROHAplB1z8TlIVyLGz2u7T3KE9jBWHijVcgIypF/3vR4tStOe1T1R3ULn/aiAvN+6zbwVjIuCVVy0KS8xn/kWwEfg9Hmm24LFrqADBax0l+C5WH0TzgtYnaD5697A9C1Fw6Tu5NSDHNbMKMQLDVxEGyPygv8+D40VLNtQQNRqc3fHt3oxsS9uzMqtFVSE43xvt9+nwYAI9ZEGb44YKkL25iu42yvggMse2dEWuVZWIHTdlGMI/SVUhK6Ps1nu4YurBi1mwI9P8/6JLYaz20YmyjNq4eoSoEdw1VJBbBwu2zIe0Bb16KMuC+eC6tiDYJHEOYRmH866xdLcRjislshMOpvrhnoxsTlnf7gRDMae0B6UlYP7FsF4hbJdEmiTmM/9yb/5/0aVw2hp2n9twk0TUcHZkpuTHe3GevPXvsKVhnxzFJb1zhpGrDlWBoDWM2RomQNCCwanzDYgawb2jBXlAVflWaw545dS2oEQ4mT4nCI7OUJMlw34NESA4jWuzChBOfxBZZ7I0Ldf35WTA4rPVcSHckPDrVVn0/FrV47Qsak0zsYZ4BsZKU7oCsb64Jmpsj06U9E51qyfUl4abuBprjrrUY9UWYIAYhgOjxrj1nMhyKD5uGyzIsMXlfsTnlSNUFWLBwqK6gvkPBG3YivEraYAAQefdJyfLkqkwQIjsgMUq94xY26wU18Njk36JMkEOCY/Pcc0MEMMQIDsyFfa+IrIJqpDbB/OW77laFG6ShAWb4+pJs3p8VsZ8upmiFer+0c+qAOnPT9nSr4eIZmxJl+V3YyVLq5C4zysroj7dJ4ue25GqSlsYtGb+A+o+QLD/Y7DA3YNEdkK/0ruHCjJh4dJ5DM+sUXfXFl4faxoWqR2dDFg2fAV1HyBYUpixYXMTEf25TamS7Mha12gR+xu6Iz7xWzU+U+M6w016/sPKh6euAwTDViOFqnD+nMh+k+VpuX+sJBUrDuOWmYn0BQGPBOv6KmbchrhfukLWlmd1/dCXVILszVeEBQiR/TD/8ch4ydIl9DjuNmpBj6dal1TBenpHSOIWLzKw9r/usKJ6Be9DpzcickSfuoHDIW5W3cMl/R5Lx/hr1bKIT05o9lu+wKCuAySvKpDJsnV3P0R0aOnytDw+UZK8RcMA0SavJV1maxny9CULgro6s1pdP/JYwssJdCLn4O2HjbzjZWtGAjCRjl5P9IzOsFde3hG0pHnibHX9yGdV9VHmBhAiR+0rVGTAwqFkG66TNWOm+gjJkrA9rYrrNkAQG2Olqp5IJyLnZMrTsjFVsWRTIcKDI1jPWBxpkvO6QhKxqcVL3T70yA0MX3EEi8hZWISF4xSsuJnzeGaGsWjGixcEZW3cvi7FdRsgU9PTklJ3PvhMRM7anatI2qIFLXyLz+gKe+X8rrAEbQzUOg4QkdxUlT2wiFxgvFSVvRbMg+D9XeCbXLdtf8XCsG6caKe6DRDA8BVfWkTOw3EKu7JTps+DTKv/y3KcWu86f223vdUH1G2AoKydUncmLG+JnDdVnWlsavY8COY/jm0O6J3XjSrcJHLBkojuTGy3ug2QqrozQSNQa0Zdiehw4L2IxqYlk0sQBMhFS8LyuaOS8qpFoYYMkpe2h+T0tuDs37ZF3QYITHEAi8gV8E7EAVNWzFdgJ/qpbSG5dENSPr4+KS9eENBzAo1gZaxJ3rI8Ks0ObaZ05m+1gUf9n8+D/yUiN5goV3V7IavgfJCzFobkkiMS8salUVkYqtvLm4ahq9d1R2Vd3P6hqwPq+hHGXhoGCJE7pCtVyVk84Y055MVhn7x7VUw+c1RSTm4N2NLSw274kc7sDOtNg7hRdkrdBgheSDhoxsHHloieBd2x8ybPgRxMSKXGya1BXY28fklEYjbtzLbL+oRPVVkRy9u1Px9n/3YL4eWC7fw2r2ojooNAdtjdm25pxCfvWx2Xf1kbl446GdJCs8R/VBXWeht3nB9MfTyizwFlK9ZEN7EEIXIFRIdVpxMeCm4kX9cdkQ+tTcgaB+cLzIDTFy9eEpWXOLTqarY6DhCPJFV5xwqEyB1QfOQqs3/XHrihPLszJP+6ISFHJ52/czcCC63eoMLjDYsjjs57PFvdBgiCo9nvkYBLHmiiRofao2R/AfJnjm8OyIfWxeWEltoLkTMWhuTvl0dt67Q7F3UbINCiIjtg/aFcRDRnDieIcpwKkQ+sjctRNVSJvKw9KP+0KiYLMIblIu7615is2c/jLoncAu/EkEvGlI9OBuT9a2J6NZPbnaiqJQQeFgS4TV1fXUvT0+K+h5yoMWEeAqMCbvGC1pm7eqxqcqtjm/3ywXUJR/pczYV7H7l5mChV5deDBfnK1rT0Zh2atSOiP4N+WP158xsqGoVaCH2k3rkyLgm/OyqjZ8M8zcc3JOSIhHuH2jzT0w6sq7NIqlyVB8ZKcvtQQR7ZX5T9Ts/YEdGf4BK9JNokr1wYlrM6Q/qu2g27xAtT0/Lt3oxcuzsrFp15dVjwkJzaHpT3rI7JOhfs9TiUuggQvAAemyjJTfvycv9YUVUgNf8jEdUtbJ5eqs/ujuggWRRyfqXLSHFKPrc5Jb8ZLs7+lq2wwOpM9ZggPNCSxe1qPkD68hX5RX9BhUdOhgouuH0gojlBbmBFFPY14Cxvp5enPq5uQi/bOCl7suafnDgXaI54fndE3ro8Kp0uCNW5qNkAQU+d344U5fuq7NyaLuvxVSKqPa0Bj6pEwnLhkoisdHCyGFMzP96bk//sSdm+4bE96JW/WxaV1y0O19TK0ZoMEFQdP9qTk5sH8hyuIqoDWN27Pu6TtyyPyWntQd0M0Qn71Z3o5ZtTeh7VLkckfPK2FTM/NxrA1pKaChA0Y3t4vChX92bk0Ymy6ecrE5GzFgQ9em7kYlWNdDg0jPPI/pJc8uSE5UPi+PFe2haSt6+MuqIxohE1EyAYssIk+bW7M9Kfs/aJJSLnoPg4rSMo/7DSmY6zWGb8Xz0ZPTxu1fElXWGvXLw0KucuCjt2mqAZaiJAhgtT6snMyc/6c5Kx6hklIlfZkPDJu1SInNYRsv1gOOwf++gTE7I9be5kCCbKX9Ye0nMdJ7QEXNMU0SjXB8jefEWuUncDtw8WOGRF1GA6Q17559Vx3Uk3YOP8AK411+zKyjd3pKVowoAHFpihlfxrFkXk1YtCNV11PJurA6QnU5GvbU/L70aKLmjBRkROwLzIm5fF5G+WRGydXN+dq8i/qipkY2p+VQiGq85aGJbzusN6/0utVx3P5toA2ZQqy9e2peXB8dLsbxFRg8GRtG9fEZOLlkYkbFOI4PTEa3fn5FsGqhAUS21Br7xkQVAuUMGxNu63Nfzs4soAeWKyJJ/fnFIhMr/kJ6L6Efd75I1Lo/KW5VHbQmRHtiIffny/7MzMbXMhuq23hbxyaltIzuwIyoaEv6b2dRwu1wXI9kxZPrcpJY9NlGd/i4gaHCah370qLn+rKhE79kygTdK/b0/L9Xtzh5yDRYXUHWmSU1XFgRVka2J+20LOSa4KEKx8+NKWlNw/xmErInpuyYBH3rUyLm9YHLYlRB4YK8onNk7K8Kx9ITieoy3YJGtjPjm9IyzHJH2yMNSkqhDr/01u4ZoAGS1W5UtbU3LboH07QImoNiFEPro+Ked0hmZ/y3S4Nn1y44TcN1rSm/9ag17dJffYZEBOXhDQzSCT6BDZgFwRIOlyVa7akZEbVJnIbR5ENBdLo03yiQ0JObE1OPtbpsJkOvru/WF/SdYl/LrlSqeqPGIqNBpglOqQHA8QjCtix+c3dqSlMLd5KiIi7fhmv1xyRFJWx6xtwlhRl0mcFdII8xqHw/G66/6xgvxgT5bhQUSHDT3xvrcrI5MWnwSFvRsMj7/kaIBgidy3e7N/MTlFRDRXdw4V5Of9eT3URPZyLECylWk9dPXUJJfrEpFxGL24vi8nD3PTse0cCRDMe9yq7hpuG8zrQ1yIiOajLzcl3+nNyCDHwm3lSID0Zstyw96s7ad+EVH92pgqy68GCnrCm+xhe4Bg6AqnCW41uU0yETU2HGv90/6sXm5L9rA9QB6dKMqdwwUOXRGR6fblqvKzvrzeW0bWszVAxtUtwnV78zLJc8yJyAK4stw7WpB72Q7JFrYGyL2jRVWB8IklIutgbvUX/TndgoSsZVuAYHXEjX05VVqy+iAiaz05WZK7RniKqdVsCxBUH1glQURktayqQm7Zl5eRIpf1WsmWAJkoVeWuoYLuJUNEZIct6bI8sp83rVayPEBQQT4wXpJNaT6RRGSfvCo+fjWQkxTvXC1jeYBgOd3dwwVJceUVEdlsm7pxZbsk61geINsyFXlsoqQrESIiO40Vp+V23MCyCrGEpQGClgIPjZW4nI6IHIEb18fVDewQJ9MtYWmAIDjuGytyKR0ROWZffkr+uL/M7hcWsDRAejMVGSyw5xUROQcNeu9XN7IF3smazrIAyasn6/fqSdvPyXMictj2TFn6eDNrOssCBEdMbk6VOXxFRI4bL1bl0f1lnlpoMssCBMNXe3jgBxG5ANbxbE2XJcc7WlNZEiB4jrarAGHfKyJyAxQeW1Nl3RGczGNJgGQqVenJVvQBL0REbrCvMCUD2J5OprEkQLDmersqF1l/EJFbYGHPHhUgnAYxjyUBMlqoygR3fhKRi2BEZEuqrIOEzGFJgPRmK3ySiMhVUHnw2mQuSwJkp3qSChU+SUTkLpifLXIMyzSWBEhfbkovmyMicpOMurHtz3N7gVksCZDJCtODiNwHw1cDhSo3OJvEmgDhBDoRuRB2oqPJK3ekm8OSAOGTQ0RuhMERnA3CS5Q5LAkQzp8TkRthbCQzVdVnFdH8WRIgfG6IyI1QeUyWOAdiFksChE8OEbkVJtI5zG4OSwKEiMitsMaHHbHMwQAhooaCeRAWIOZggBARkSEMECIiMoQBQkQNpUl9eD2zf5eMYIAQUUNBePDCZw5LHkemOxG5VbDJIz4PL1JmYIAQUUNJ+L3is+TK13gseRgt+Y8SEc2TKj4k7mMFYhZLrvU+liBE5EI+HSBejpKYxJIAieFZIiJyGQxdtQebxG/Jla/xWPIwIuGJiNzGr0qPBQEOYZnFkit9d5gJT0Tugwn0pVHf7N8mgyy5zC+N+CTIQUYicplIk0dimEknU1gSIKtiPolwHoSIXGZJ2CchBohpLAmQzpBXJz0RkVtgWH1t3CdhXptMY0mALAw2ybIIxxmJyD0QHKuiPj2RTuawJECaA15Zn/BzIp2IXKNFXZe6wmilSGax5BIfUAm/IsqxRiJyj7Uxv7QFGSBmsiRAYH3Cx7QnIlcIqivduoSfm5xNZlmAtPq9sjrmY8sAInJczO+RY5I+3YmXzGNZgMR8XjmlLaQblxEROWlF1C/r4n7h1chclgUIKo/1cZ+euCIicgqKjhe2BPRNLZnL0ke0K9QkL1BPHFOfiJyyIOiVF7YGdJCQuSwNEKzCOqk1KNwSQkROOSLh1+2VyHyWBggc2+yX9XH/7N8mIrIc+ia+tC3EoXSLWP6oovf+6R0h4YpeIrLbElV5nNLG4SurWB4geOJObQvKYpaQRGQjLAD9K3XzujDEu1erWB4ggPHHl7eHuCeEiGyzKIzRjyAX8VjIlgBBFXLGwqB6Qm3564iowaEP3xmq+lgc5siHlWy7oqM31jmdEd1SgIjISsvV9eb87jBbt1vMtss5Tig8uzMkK2K8IyAi6yAzzloY4pESNrAtQAAnFb62OyKc0yIiq2xI+OWcRWGuvLKBrQGC5/OM9qAcmwzM/hYR0bwl/B75a3WTuoh3qbawNUCgQz2xFy+NqM+2/9VEVMdwg3paR0jOXBjkik+bOHIVf9GCoLyaJSYRmWhZtEkuWhKRJI9CtY0jjzR6ZL1+cUSOTrLFCRHNHzpdvE5dU9g2yV6OBAh0q2f87Sui0smhLCKap1ctCst5HNWwnaNXbwxlXbw0ylVZRGQYjs9+07KoJNkw0XaOPuJ+r0de2x2WszvDs79FRPS8sBjn3StjeqMy2c/RAAFMeGEo68RWLu0lormL+z3y98tjckpbcPa3yCaOBwig2eK/rInJmjjvIojo+WGu44LuiPx1d1iPZJAzXBEgcEwyIO9ZHZPuiGv+SUTkQgiPc7rC8uZlmD9leDjJVVfrl7WH5J9WJbjJkIgO6hWdIXnvqpg+65yc5apnAPcSZ3cG5R9XxRkiRPRnMFJ1WntQ3rsa1wcu3XQD112lfR6PnKfK03czRIjoWc7oCMqH18f1HjJyB8+0Mvs33WBK/atuHSzIN3akpS83NfvbRNQgMM1x5sKQvH9tnE0SXca1AXLA3cMF+XpPWnozDBGiRoO9ged3R+QdK6I829yFXB8g8Mj+knxThcgf9pfF9f9YIjJFS8AjFy6Jyt8uZYNEt6qJAIHduYp8pzcjvx4sSKk6+7tEVE+wnP+dK+PyyoUhLtV1sZoJEBgrVuX6vpz8rD8nwwWmCFG9QVa8oCUgb1sRlRe2Btkc0eVqKkCgVJ2WB8aK8r2dWXlisqwn24mo9uE0wdcsCssbl0W50qpG1FyAHNCbrciP9uTk10N5mSzV5I9ARDKzv2Nd3CcXLY3KX3UEJebjfEetqNkAgWxlWu5T1chP+3Ly2ERJClyoRVRTsNfrzI6QvH5JRFayo27NqekAOWBQJcfP+/Pyq8G87M1OcaUWkcshK05sCepmiCcvCEqYkx01qS4CBDA3gmGtm1SQ/F5VJf25Kc6PELkMWrAfEffLud0RecmCgLTyEKiaVjcBckBBpUZPpiw/31eQ340W9Gqtal39hES1B3Pi6Lh9ZmdITm8PSnuQk+T1oO4C5IBMpSp7VBVy93BR7lVBMpCfkslyXf6oRK6EvX9tQa+sUxXHKzvDcnyzXwcHj++oH3UbIAdgGGukOCUPjpfknpGCbJosy2ixKpW6/qmJnINqY3XMrwIjIKd1BPUKK66sqk91HyAHIEhS5arszVXk0YmyPKwCZZf6elL9Xk6lCedLiIzBsRzJgFfPZxyVDMgLWwKyPuGT9kCTRHwsN+pZwwTIsyEsMMQ1pCqTJycrsj1dlh2Zim6XgjDBhDzbpRD9JQw/ITAC6gsc6LQ86pNVUVQbflkV80nC7+WKqgbSkAHybBX142PifUJVIoP5KRkuTctOFSa92bL+dUoFSlaFTbE6U6VwrwnVO4QEMgAfOG8cgRBVlcQCFQ5dEZ+sVkGxNNyku+NiTgPfY2g0poYPkOeSV0kxWlLhUZ6WMVWl9OWrMqo+I2T25qZUlVJVbzK+Yag+4AKAVzOCA4ERUh9Ybhv3eaVZhUZ3RIWFqjZaAupD/bpVfY2D34gYIEREZAiXRhARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMoQBQkREhjBAiIjIEAYIEREZwgAhIiJDGCBERGQIA4SIiAxhgBARkSEMECIiMuT/A80KizI2kDcpAAAAAElFTkSuQmCC",
+ "Label": "Monitoring Solution pack for Azure Backup",
+ "Link": {
+ "Label": "More info",
+ "Url": "https://azure.microsoft.com/en-us/services/backup/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Monitor Azure Backup!",
+ "Content": "## Welcome to the monitoring solution of Azure Backup!\nYou can view:\n\n1. **Backup Jobs** and what backup jobs *failed*\n2. **Restore jobs** and what restore jobs *failed*\n3. **Critical Alerts** that need your urgent attention\n4. **Cloud Storage in GB** view along with **Top 5** datasources backed up along with their storage in GB\n5. **Data sources** being backed up\n\n\n[Microsoft](https://assets.onestore.ms/cdnfiles/onestorerolling-1607-15000/shell/v3/images/logo/microsoft.png \"Microsoft\")"
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Backup Jobs Breakdown (Non Log)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Backup Jobs Breakdown (Non Log)"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#ba141a",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#ba141a"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | distinct JobUniqueId_g, BackupItemUniqueId_s, JobStatus_s, Resource | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s, JobStatus_s, Resource | extend Vault= Resource | summarize count() by BackupItemFriendlyName_s, JobStatus_s, Vault, BackupItemUniqueId_s | order by count_ desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s, RecommendedAction_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s, RecommendedAction_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s , ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Backup Jobs BreakDown (Log)",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Backup Jobs Breakdown (Log)"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#dd5900"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project BackupItemFriendlyName_s , JobStatus_s, Resource | extend Vault= Resource | summarize count() by BackupItemFriendlyName_s, JobStatus_s, Vault | order by count_ desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Datasources",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where OperationName == \"Job\" and JobOperation_s == \"Backup\" and JobStatus_s == \"Failed\" and (JobOperationSubType_s == \"Log\" or JobOperationSubType_s == \"Recovery point_Log\") | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Restore Jobs Breakdown",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Restore Jobs Breakdown"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | where JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#007233",
+ "#ba141a",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Cancelled",
+ "color": "#fff100"
+ },
+ {
+ "value": "Completed",
+ "color": "#007233"
+ },
+ {
+ "value": "Failed",
+ "color": "#ba141a"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | where OperationName == \"Job\" and JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" and JobStatus_s == \"Failed\" | distinct JobUniqueId_g, BackupItemUniqueId_s, JobStatus_s, Resource | project BackupItemUniqueId_s, JobStatus_s, Resource | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemUniqueId_s, JobStatus_s, Resource | extend Vault= Resource | summarize count() by BackupItemFriendlyName_s, BackupItemUniqueId_s , JobStatus_s, Vault | order by count_ desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | where OperationName == \"Job\" and JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" and JobStatus_s == \"Failed\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\" ; Events | where OperationName == \"Job\" and JobOperation_s == \"Restore\" or JobOperation_s == \"Recovery\" and JobStatus_s == \"Failed\" | distinct JobUniqueId_g, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | project BackupItemUniqueId_s, ProtectedContainerUniqueId_s, JobStatus_s, Resource, JobFailureCode_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s | project BackupItemUniqueId_s , BackupItemFriendlyName_s, BackupItemName_s, BackupItemType_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, BackupItemType_s, JobStatus_s, Resource, JobFailureCode_s | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts from Azure Resources Backup",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Alert Distribution "
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s | where CurrentStatus == \"Active\" | summarize count() by AlertSeverity_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#008272",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Critical",
+ "color": "#e81123"
+ },
+ {
+ "value": "Warning",
+ "color": "#fff100"
+ },
+ {
+ "value": "Information",
+ "color": "#55d455"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project BackupItemName_s, AlertCode_s, HitCount | order by HitCount desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "HitCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_s != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_s | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_s ) on AlertUniqueId_s | project AlertUniqueId_s, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | join kind=inner ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Alerts from On-prem backup",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Alert distribution"
+ },
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join kind= inner (AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s | where CurrentStatus == \"Active\" | summarize count() by AlertSeverity_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Critical",
+ "color": "#ba141a"
+ },
+ {
+ "value": "Warning",
+ "color": "#ffb900"
+ },
+ {
+ "value": "Information",
+ "color": "#55d455"
+ }
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s | where CurrentStatus == \"Active\" | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | project BackupItemName_s, AlertCode_s, HitCount | order by HitCount desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join kind=inner (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, BackupManagementServerUniqueId_s, ProtectedContainerUniqueId_s ,lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | where CurrentStatus == \"Active\" | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | join kind=leftouter( Events | where OperationName == \"BackupManagementServer\" | distinct BackupManagmentServerUniqueId_s, BackupManagmentServerName_s | project BackupManagmentServerUniqueId_s, BackupManagmentServerName_s ) on $left.BackupManagementServerUniqueId_s == $right.BackupManagmentServerUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, ProtectedContainerFriendlyName_s, BackupManagmentServerName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"Alert\" | where AlertUniqueId_g != \"\" | summarize lastOccurred = arg_max(TimeGenerated, *) by AlertUniqueId_g | extend CurrentStatus = AlertStatus_s | join kind=inner (Events | where OperationName == \"Alert\" | where AlertStatus_s == \"Active\" | summarize HitCount = count() by AlertUniqueId_g ) on AlertUniqueId_g | project AlertUniqueId_g, BackupManagementServerUniqueId_s, ProtectedContainerUniqueId_s ,lastOccurred, HitCount , CurrentStatus , AlertCode_s, AlertSeverity_s, BackupItemUniqueId_s, RecommendedAction_s, Resource | where CurrentStatus == \"Active\" | join kind=leftouter ( Events | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s, BackupItemName_s ) on BackupItemUniqueId_s | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | join kind=leftouter( Events | where OperationName == \"BackupManagementServer\" | distinct BackupManagmentServerUniqueId_s, BackupManagmentServerName_s | project BackupManagmentServerUniqueId_s, BackupManagmentServerName_s ) on $left.BackupManagementServerUniqueId_s == $right.BackupManagmentServerUniqueId_s | project AlertCode_s, lastOccurred, BackupItemName_s, ProtectedContainerFriendlyName_s, BackupManagmentServerName_s, CurrentStatus, AlertSeverity_s, HitCount, RecommendedAction_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Active Datasources Protected",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Last known Protection status"
+ },
+ "Donut": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s, BackupItemProtectionState_s | summarize dcount(BackupItemUniqueId_s) by BackupItemProtectionState_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#ff8c00",
+ "#55d455",
+ "#6dc2e9"
+ ]
+ }
+ },
+ "List": {
+ "Query": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s | summarize dcount(BackupItemUniqueId_s) by BackupManagementType_s,BackupItemProtectionState_s | order by BackupManagementType_s desc",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "BackupManagement Type",
+ "Value": "BackupItems"
+ },
+ "Color": "#ff8c00",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, Resource | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}",
+ "NavigationSelect": {
+ "NavigationQuery": "let Events = AzureDiagnostics | where Category == \"AzureBackupReport\"; Events | where OperationName == \"BackupItem\" | where BackupItemProtectionState_s != \"\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerUniqueId_s, Resource | join kind=leftouter ( Events | where OperationName == \"ProtectedContainer\" | distinct ProtectedContainerUniqueId_s, ProtectedContainerFriendlyName_s | project ProtectedContainerUniqueId_s , ProtectedContainerFriendlyName_s ) on ProtectedContainerUniqueId_s | project BackupItemFriendlyName_s, BackupItemName_s ,BackupItemType_s, BackupManagementType_s, BackupItemProtectionState_s, BackupItemUniqueId_s, ProtectedContainerFriendlyName_s, Resource | extend Vault= Resource | project-away Resource | where {selected item}"
+ }
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Cloud Storage in GB",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Cloud storage in GB"
+ },
+ "LineChart": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend CloudStorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project CloudStorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s == \"Cloud\" | summarize dayCharge = avg(CloudStorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d) | summarize TotalCharge = sum(dayCharge) by bin(TimeGenerated, 1d)",
+ "yAxis": {
+ "isLogarithmic": false,
+ "customLabel": "Cloud Storage (GB)"
+ }
+ },
+ "List": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | summarize arg_max(TimeGenerated, *) by BackupItemUniqueId_s, StorageUniqueId_s | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | project StorageInGB, BackupItemUniqueId_s, StorageType_s | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project StorageInGB, BackupItemFriendlyName_s, BackupItemUniqueId_s, StorageType_s | where StorageType_s == \"Cloud\" | order by StorageInGB desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Data Sources",
+ "Value": "Cloud Data in GB"
+ },
+ "Color": "#eb3c00",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s == \"Cloud\" | project StorageInGB, BackupItemUniqueId_s, StorageType_s, TimeGenerated | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project StorageInGB, BackupItemFriendlyName_s, BackupItemUniqueId_s, StorageType_s, TimeGenerated | where {selected item} | summarize dayCharge = avg(StorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d)",
+ "NavigationSelect": {
+ "NavigationQuery": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"StorageAssociation\" | extend StorageInGB = todouble(StorageConsumedInMBs_s) / 1024 | project StorageInGB, BackupItemUniqueId_s, StorageUniqueId_s, TimeGenerated | join kind=inner ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Storage\" | distinct StorageUniqueId_s, StorageType_s | project StorageUniqueId_s, StorageType_s ) on StorageUniqueId_s | where StorageType_s == \"Cloud\" | project StorageInGB, BackupItemUniqueId_s, StorageType_s, TimeGenerated | join kind=leftouter ( AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"BackupItem\" | distinct BackupItemUniqueId_s, BackupItemFriendlyName_s | project BackupItemUniqueId_s, BackupItemFriendlyName_s ) on BackupItemUniqueId_s | project StorageInGB, BackupItemFriendlyName_s, BackupItemUniqueId_s, StorageType_s, TimeGenerated | where {selected item} | summarize dayCharge = avg(StorageInGB) by BackupItemUniqueId_s, bin(TimeGenerated, 1d)"
+ }
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "SingleQueryDonutBuilderTileV1",
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Donut": {
+ "Query": "AzureDiagnostics | where Category == \"AzureBackupReport\" | where OperationName == \"Job\" | extend JobOperationSubType_s = columnifexists(\"JobOperationSubType_s\", \"\") | where JobOperation_s == \"Backup\" and JobOperationSubType_s != \"Log\" and JobOperationSubType_s != \"Recovery point_Log\" | summarize AggregatedValue = dcount(JobUniqueId_g) by JobStatus_s | order by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#e81123",
+ "#00bcf2"
+ ],
+ "valueColorMapping": [
+ {
+ "value": "Completed",
+ "color": "#55d455"
+ },
+ {
+ "value": "Failed",
+ "color": "#ba141a"
+ }
+ ]
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT656 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT656
new file mode 100644
index 0000000..13a02a1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT656
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-optimize-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-optimize-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898709,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-optimize-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-optimize-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT656",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT656",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT657 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT657
new file mode 100644
index 0000000..e50ca02
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT657
@@ -0,0 +1,857 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-optimize-report/azuredeploy.json",
+ "/demos/backup-optimize-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898718,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-optimize-report/azuredeploy.json",
+ "/demos/backup-optimize-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT657",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT657",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "Optimize",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at whch emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "dailyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for daily retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their daily retention point duration, use the value -1."
+ }
+ },
+ "weeklyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for weekly retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their weekly retention point duration, use the value -1."
+ }
+ },
+ "monthlyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for monthly retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their monthly retention point duration, use the value -1."
+ }
+ },
+ "yearlyRPRetentionFilter": {
+ "type": "Int",
+ "defaultValue": -1,
+ "metadata": {
+ "description": "For the grid 'Backup Instances with large retention duration' that is exported by the Logic App, you can use this parameter to display only those backup instances whose configured retention duration for yearly retention points is greater than the value specified in this parameter. To display all backup instances irrespective of their yearly retention point duration, use the value -1."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "Optimize",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "Optimize",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "Optimize",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "dailyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ },
+ "monthlyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "weeklyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ },
+ "yearlyRetentionParam": {
+ "defaultValue": -1,
+ "type": "Int"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "Optimize",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Attachments": [
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-Grid1'))}",
+ "Name": "InactiveResources.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-Grid2'))}",
+ "Name": "RetentionOptimizations.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-Grid3'))}",
+ "Name": "BackupScheduleOptimizations.csv"
+ }
+ ],
+ "Body": "
\nOptimization Opportunities
\n
\nEmail Contents
\n
\n1. Attachments
a. Inactive Resources - Backup Instances with no recovery point in selected time range.
b. Retention Optimizations - List of all backup instances with retentions greater than specified value.
c. Backup Schedule Optimizations - List of all databases configured for daily full backup.
Learn more about Backup Reports",
+ "Subject": "Optimize",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-NoDataMessage": {
+ "inputs": {
+ "variables": [
+ {
+ "name": "NoDataMessage",
+ "type": "array",
+ "value": [
+ {
+ "Message": "No records found"
+ }
+ ]
+ }
+ ]
+ },
+ "runAfter": {
+ "Initialize_variable-PolicyFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable"
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForLatestData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n// DatasourceSetType\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true) \n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {union (LatestBackupItemAssociationAndStorageConsumptionTable | where (_RangeEnd-_RangeStart == 1d)), (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-JobFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "JobFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n// Report filters\n@{variables('ReportFilter_Trend')}\nlet _ProtectionStateList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _JobOperationList = \"*\";\nlet _JobStatusList = \"*\";\nlet _JobFailureCodeList = \"*\";\nlet _ExcludeLog = true;\n// Other Vars\nlet ExtRangeStart = _RangeStart - 2d;\nlet ExtRangeEnd = _RangeEnd + 2d;\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet JobUnderAzureDiagnostics = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AzureDiagnostics \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"Job\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n// Exclude Log Jobs and InProgress Jobs\n| project JobOperation = columnifexists(\"JobOperation_s\", \"\") , JobOperationSubType = columnifexists(\"JobOperationSubType_s\", \"\"), JobUniqueIdGuid = columnifexists(\"JobUniqueId_g\", \"\") , JobUniqueIdStr = columnifexists(\"JobUniqueId_s\", \"\"),\nProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), AdHocOrScheduledJob = columnifexists(\"AdHocOrScheduledJob_s\",\"\"), RecoveryJobDestination = columnifexists(\"RecoveryJobDestination_s\",\"\"),\nRecoveryJobRPDateTime = todatetime(columnifexists(\"RecoveryJobRPDateTime_s\",\"\")), RecoveryJobRPLocation = columnifexists(\"RecoveryJobRPLocation_s\",\"\"), RecoveryLocationType = columnifexists(\"RecoveryLocationType_s\",\"\"),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\",\"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\",\"\"),\nJobStatus = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode = columnifexists(\"JobFailureCode_s\",\"\"), JobStartDateTime = todatetime(columnifexists(\"JobStartDateTime_s\",\"\")), JobDurationInSecs = todouble(columnifexists(\"JobDurationInSecs_s\", \"\")),\nDataTransferredInMB = todouble(columnifexists(\"DataTransferredInMB_s\",\"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\",\"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog) \n| extend JobUniqueId = iff(JobUniqueIdGuid == \"\", JobUniqueIdStr, JobUniqueIdGuid) \n| project-away JobUniqueIdGuid, JobUniqueIdStr\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId ;\nJobTable\n};\nlet JobUnderResourceSpecific = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AddonAzureBackupJobs \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Job\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog)\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId;\nJobTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet LatestBackupItemWithProtectedContainerTable = () \n{\nTotalBackupItemDimensionTable\n| join (union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics()| where _ExcludeLegacyEvent == false),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId) on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet JobFinalTable = (){\n union isfuzzy = true \n(JobUnderAzureDiagnostics(true)| where _ExcludeLegacyEvent == false),\n(JobUnderResourceSpecific(true))\n| project JobStatus, JobUniqueId, JobOperation, JobFailureCode, JobOperationSubType, JobStartDateTime, DataTransferredInMB, AdHocOrScheduledJob, JobDurationInSecs, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId, ProtectedContainerUniqueId, TimeGenerated \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId\n| where JobOperation in~ (_JobOperationList) or '*' in (_JobOperationList)\n| where JobStatus in~ (_JobStatusList) or '*' in (_JobStatusList)\n| where JobFailureCode in~ (_JobFailureCodeList) or '*' in (_JobFailureCodeList)\n| join kind= inner (LatestBackupItemWithProtectedContainerTable) on BackupItemUniqueId\n| project JobUniqueId, JobOperation, JobStatus, JobFailureCode, JobOperationSubType, JobStartDateTime, JobDurationInSecs, DataTransferredInMB, AdHocOrScheduledJob, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId = BackupItemUniqueId1, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, StorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(JobFinalTable)))\n| project UniqueId = JobUniqueId, OperationCategory = JobOperation, Operation = JobOperationSubType, Status = JobStatus, ErrorTitle = JobFailureCode, StartTime = JobStartDateTime, DurationInSecs = JobDurationInSecs, DataTransferredInMBs = DataTransferredInMB, RestoreJobRPDateTime = RecoveryJobRPDateTime, RestoreJobRPLocation = RecoveryJobRPLocation, BackupInstanceUniqueId = BackupItemUniqueId, BackupInstanceId, BackupInstanceFriendlyName = BackupItemFriendlyName, DatasourceResourceId, DatasourceFriendlyName = BackupItemFriendlyName, DatasourceType, BackupSolution, DatasourceSetResourceId, DatasourceSetType, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-PolicyFunction": {
+ "runAfter": {
+ "Initialize_variable-JobFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "PolicyFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')} \n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet PolicyWithExtendedPropsUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), PolicyTimeZone = columnifexists(\"PolicyTimeZone_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), DiffBackupFormat = columnifexists(\"DiffBackupFormat_s\", \"\"),\nDiffBackupDaysofTheWeek = columnifexists(\"DiffBackupDaysofTheWeek_s\", \"\"), DiffBackupRetentionDuration = toint(columnifexists(\"DiffBackupRetentionDuration_s\", \"\")), DiffBackupTime = columnifexists(\"DiffBackupTime_s\", \"\"), LogBackupFrequency = toint(columnifexists(\"LogBackupFrequency_s\", \"\")), LogBackupRetentionDuration = toint(columnifexists(\"LogBackupRetentionDuration_s\", \"\")),\nBackupFrequency = columnifexists(\"BackupFrequency_s\", \"\"), BackupTimes = columnifexists(\"BackupTimes_s\", \"\"), BackupDaysOfTheWeek = columnifexists(\"BackupDaysOfTheWeek_s\", \"\"), RetentionType = columnifexists(\"RetentionType_s\", \"\"), RetentionDuration = toint(columnifexists(\"RetentionDuration_s\", \"\")),\nDailyRetentionDuration = toint(columnifexists(\"DailyRetentionDuration_s\", \"\")), DailyRetentionTimes = columnifexists(\"DailyRetentionTimes_s\", \"\"), \nWeeklyRetentionDuration = toint(columnifexists(\"WeeklyRetentionDuration_s\", \"\")), WeeklyRetentionTimes = columnifexists(\"WeeklyRetentionTimes_s\", \"\"), WeeklyRetentionDaysOfTheWeek = columnifexists(\"WeeklyRetentionDaysOfTheWeek_s\", \"\"),\nMonthlyRetentionDuration = toint(columnifexists(\"MonthlyRetentionDuration_s\", \"\")), MonthlyRetentionTimes = columnifexists(\"MonthlyRetentionTimes_s\", \"\"), MonthlyRetentionFormat = columnifexists(\"MonthlyRetentionFormat_s\", \"\"), MonthlyRetentionDaysOfTheMonth = columnifexists(\"MonthlyRetentionDaysOfTheMonth_s\", \"\"), MonthlyRetentionDaysOfTheWeek = columnifexists(\"MonthlyRetentionDaysOfTheWeek_s\", \"\"), MonthlyRetentionWeeksOfTheMonth = columnifexists(\"MonthlyRetentionWeeksOfTheMonth_s\", \"\"),\nYearlyRetentionDuration = toint(columnifexists(\"YearlyRetentionDuration_s\", \"\")), YearlyRetentionTimes = columnifexists(\"YearlyRetentionTimes_s\", \"\"), YearlyRetentionMonthsOfTheYear = columnifexists(\"YearlyRetentionMonthsOfTheYear_s\", \"\"), YearlyRetentionFormat = columnifexists(\"YearlyRetentionFormat_s\", \"\"), YearlyRetentionDaysOfTheMonth = columnifexists(\"YearlyRetentionDaysOfTheMonth_s\", \"\"), YearlyRetentionDaysOfTheWeek = columnifexists(\"YearlyRetentionDaysOfTheWeek_s\", \"\"), YearlyRetentionWeeksOfTheMonth = columnifexists(\"YearlyRetentionWeeksOfTheMonth_s\", \"\"), ResourceId, TimeGenerated\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), ResourceId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated;\n PolicyTable \n};\nlet PolicyWithExtendedPropsUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where OperationName == \"Policy\" \n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated;\n PolicyTable \n};\nlet PolicyHistoryWithExtendedPropsUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), PolicyTimeZone = columnifexists(\"PolicyTimeZone_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), DiffBackupFormat = columnifexists(\"DiffBackupFormat_s\", \"\"),\nDiffBackupDaysofTheWeek = columnifexists(\"DiffBackupDaysofTheWeek_s\", \"\"), DiffBackupRetentionDuration = toint(columnifexists(\"DiffBackupRetentionDuration_s\", \"\")), DiffBackupTime = columnifexists(\"DiffBackupTime_s\", \"\"), LogBackupFrequency = toint(columnifexists(\"LogBackupFrequency_s\", \"\")), LogBackupRetentionDuration = toint(columnifexists(\"LogBackupRetentionDuration_s\", \"\")),\nBackupFrequency = columnifexists(\"BackupFrequency_s\", \"\"), BackupTimes = columnifexists(\"BackupTimes_s\", \"\"), BackupDaysOfTheWeek = columnifexists(\"BackupDaysOfTheWeek_s\", \"\"), RetentionType = columnifexists(\"RetentionType_s\", \"\"), RetentionDuration = toint(columnifexists(\"RetentionDuration_s\", \"\")),\nDailyRetentionDuration = toint(columnifexists(\"DailyRetentionDuration_s\", \"\")), DailyRetentionTimes = columnifexists(\"DailyRetentionTimes_s\", \"\"), \nWeeklyRetentionDuration = toint(columnifexists(\"WeeklyRetentionDuration_s\", \"\")), WeeklyRetentionTimes = columnifexists(\"WeeklyRetentionTimes_s\", \"\"), WeeklyRetentionDaysOfTheWeek = columnifexists(\"WeeklyRetentionDaysOfTheWeek_s\", \"\"),\nMonthlyRetentionDuration = toint(columnifexists(\"MonthlyRetentionDuration_s\", \"\")), MonthlyRetentionTimes = columnifexists(\"MonthlyRetentionTimes_s\", \"\"), MonthlyRetentionFormat = columnifexists(\"MonthlyRetentionFormat_s\", \"\"), MonthlyRetentionDaysOfTheMonth = columnifexists(\"MonthlyRetentionDaysOfTheMonth_s\", \"\"), MonthlyRetentionDaysOfTheWeek = columnifexists(\"MonthlyRetentionDaysOfTheWeek_s\", \"\"), MonthlyRetentionWeeksOfTheMonth = columnifexists(\"MonthlyRetentionWeeksOfTheMonth_s\", \"\"),\nYearlyRetentionDuration = toint(columnifexists(\"YearlyRetentionDuration_s\", \"\")), YearlyRetentionTimes = columnifexists(\"YearlyRetentionTimes_s\", \"\"), YearlyRetentionMonthsOfTheYear = columnifexists(\"YearlyRetentionMonthsOfTheYear_s\", \"\"), YearlyRetentionFormat = columnifexists(\"YearlyRetentionFormat_s\", \"\"), YearlyRetentionDaysOfTheMonth = columnifexists(\"YearlyRetentionDaysOfTheMonth_s\", \"\"), YearlyRetentionDaysOfTheWeek = columnifexists(\"YearlyRetentionDaysOfTheWeek_s\", \"\"), YearlyRetentionWeeksOfTheMonth = columnifexists(\"YearlyRetentionWeeksOfTheMonth_s\", \"\"), ResourceId, TimeGenerated\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), ResourceId, TimeRangeEndDay = startofday(TimeGenerated)\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\nPolicyTable\n};\nlet PolicyHistoryWithExtendedPropsUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId, TimeRangeEndDay = startofday(TimeGenerated)\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n PolicyTable \n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\n// Business Logic\nlet ActivePolicyUnderAzureDiagnostics = ()\n{\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderAzureDiagnostics() | join kind = inner\n\t(BackupItemAssociationUnderAzureDiagnostics() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter\n\t| join kind= inner (\n\t PolicyWithExtendedPropsUnderAzureDiagnostics ) on ResourceId, PolicyUniqueId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated;\n\t};\nBIA_Policy\n};\nlet ActivePolicyUnderResourceSpecific = ()\n{\t\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderResourceSpecific() | join kind = inner\n\t(BackupItemAssociationUnderResourceSpecific() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter\n\t| join kind= inner (\n\t PolicyWithExtendedPropsUnderResourceSpecific ) on ResourceId, PolicyUniqueId\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated;\n\t};\nBIA_Policy\n};\nlet ActivePolicyHistoryUnderAzureDiagnostics = ()\n{\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderAzureDiagnostics() | join kind = inner\n\t(BackupItemAssociationHistoryUnderAzureDiagnostics() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeRangeEndDay\t\n\t| join kind= inner (\n\t PolicyHistoryWithExtendedPropsUnderAzureDiagnostics ) on ResourceId, PolicyUniqueId, TimeRangeEndDay\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n\t};\nBIA_Policy\n};\nlet ActivePolicyHistoryUnderResourceSpecific = ()\n{\t\t\n\tlet BIA_Policy = ()\n\t{\t\n\tBackupItemUnderResourceSpecific() | join kind = inner\n\t(BackupItemAssociationHistoryUnderResourceSpecific() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeRangeEndDay\n\t| join kind= inner (\n\t PolicyHistoryWithExtendedPropsUnderResourceSpecific ) on ResourceId, PolicyUniqueId, TimeRangeEndDay\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n\t};\nBIA_Policy\n};\nlet PolicyExtended_LatestTable = () {\nunion\n(ActivePolicyUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ActivePolicyUnderResourceSpecific())\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId};\nlet PolicyExtended_HistoryTable = () {\nunion\n(ActivePolicyHistoryUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ActivePolicyHistoryUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId, TimeRangeEndDay};\nlet FinalTable_V1Vault = () {union (PolicyExtended_LatestTable | where (_RangeEnd-_RangeStart == 1d)), (PolicyExtended_HistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project UniqueId = PolicyUniqueId, Name = PolicyName, TimeZone = PolicyTimeZone, Id = strcat(ResourceId, \"/backupPolicies/\", PolicyName), \nBackupFrequency = iff(isnotempty(BackupFrequency), pack(\"BackupFrequency\", BackupFrequency), dynamic(null)),\nDiffBackupFormat = iff(isnotempty(DiffBackupFormat), pack(\"DiffBackupFormat\", DiffBackupFormat), dynamic(null)),\nLogBackupFrequency = iff(isnotempty(LogBackupFrequency), pack(\"LogBackupFrequency\", LogBackupFrequency), dynamic(null)),\nDailyRetentionDuration = iff(isnotempty(DailyRetentionDuration), pack(\"DailyRetentionDuration\", DailyRetentionDuration), dynamic(null)),\nWeeklyRetentionDuration = iff(isnotempty(WeeklyRetentionDuration), pack(\"WeeklyRetentionDuration\", WeeklyRetentionDuration), dynamic(null)),\nMonthlyRetentionDuration = iff(isnotempty(MonthlyRetentionDuration), pack(\"MonthlyRetentionDuration\", MonthlyRetentionDuration), dynamic(null)),\nYearlyRetentionDuration = iff(isnotempty(YearlyRetentionDuration), pack(\"YearlyRetentionDuration\", YearlyRetentionDuration), dynamic(null)),\nDiffBackupRetentionDuration = iff(isnotempty(DiffBackupRetentionDuration), pack(\"DiffBackupRetentionDuration\", DiffBackupRetentionDuration), dynamic(null)),\nLogBackupRetentionDuration = iff(isnotempty(LogBackupRetentionDuration), pack(\"LogBackupRetentionDuration\", LogBackupRetentionDuration), dynamic(null)),\nBackupSolution, TimeGenerated, VaultUniqueId, VaultResourceId = ResourceId, VaultName, VaultTags, VaultLocation = AzureDataCenter, VaultSubscriptionId = SubscriptionId, VaultStore_StorageReplicationType = StorageReplicationType,VaultType = \"Microsoft.Recoveryservices/vaults\"\n| project UniqueId, Name, TimeZone, Id, BackupSolution, TimeGenerated, VaultUniqueId, VaultResourceId, VaultName, VaultTags, VaultLocation, VaultSubscriptionId, VaultStore_StorageReplicationType, VaultType, ExtendedProperties = bag_merge(BackupFrequency, DiffBackupFormat, LogBackupFrequency, DailyRetentionDuration, WeeklyRetentionDuration, MonthlyRetentionDuration, YearlyRetentionDuration, DiffBackupRetentionDuration, LogBackupRetentionDuration)\n};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForLatestData": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Latest",
+ "type": "string",
+ "value": "let _RangeStart = iff(( datetime(@{parameters('endDate')})== datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('endDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Scope": {
+ "actions": {
+ "Create_CSV_table-Grid1": {
+ "runAfter": {
+ "Run_query_and_list_results-Grid3": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-Grid1')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-Grid1')?['value'])"
+ }
+ },
+ "Create_CSV_table-Grid2": {
+ "runAfter": {
+ "Create_CSV_table-Grid1": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-Grid2')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-Grid2')?['value'])"
+ }
+ },
+ "Create_CSV_table-Grid3": {
+ "runAfter": {
+ "Create_CSV_table-Grid2": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-Grid3')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-Grid3')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-Grid1": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = datetime(@{parameters('startDate')});\nlet RangeEnd = datetime(@{parameters('endDate')});\nlet BackupInstanceFunctionRedirect = (){\n@{variables('BackupInstanceFunction')}\n};\nlet BackupItemWithoutSuccessfulBackup = (){\n// calling LA System Function\n@{variables('JobFunction')}\n| where OperationCategory has \"Backup\"\n| where Status in (\"Completed\",\"CompletedWithWarnings\")\n| join kind= rightanti (\n// calling LA System Function\nBackupInstanceFunctionRedirect\n) on $left.BackupInstanceUniqueId == $right.UniqueId\n| project UniqueId, BackupInstanceFriendlyName = FriendlyName, DatasourceType, ProtectionInfo, VaultResourceId\n};\nlet BackupItemWithoutSuccessfulBackupAndItsRecoveryPointTable = ()\n{\nBackupItemWithoutSuccessfulBackup | join \n(\n// calling LA System Function\nBackupInstanceFunctionRedirect\n) on UniqueId\n| where not(LatestRecoveryPoint >= RangeStart and LatestRecoveryPoint <= RangeEnd)\n};\nBackupItemWithoutSuccessfulBackupAndItsRecoveryPointTable\n| sort by UniqueId asc \n| project BackupInstance=BackupInstanceFriendlyName, Id, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=PolicyName, LatestRecoveryPoint, Vault=VaultResourceId, AzureResource=DatasourceSetResourceId, DatasourceType",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-Grid2": {
+ "runAfter": {
+ "Run_query_and_list_results-Grid1": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let DailyRetentionParam = @{parameters('dailyRetentionParam')};\nlet WeeklyRetentionParam = @{parameters('weeklyRetentionParam')};\nlet MonthlyRetentionParam = @{parameters('monthlyRetentionParam')};\nlet YearlyRetentionParam = @{parameters('yearlyRetentionParam')};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n| extend ExtendedPropertiesJson = parse_json(ExtendedProperties)\n};\nlet BackupInstanceFunctionRedirect = ()\n{\n@{variables('BackupInstanceFunction')}\n};\nlet OutputTable = () {union isfuzzy = true \n// calling LA System Function\nBackupInstanceFunctionRedirect\n| join kind = leftouter (\n// calling LA System Function\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n};\nOutputTable\n// query to transform function output\n| extend DailyRPRetentionDuration = ExtendedPropertiesJson.DailyRetentionDuration, WeeklyRPRetentionDuration = ExtendedPropertiesJson.WeeklyRetentionDuration, MonthlyRPRetentionDuration = ExtendedPropertiesJson.MonthlyRetentionDuration, YearlyRPRetentionDuration = ExtendedPropertiesJson.YearlyRetentionDuration\n| where (DailyRPRetentionDuration > DailyRetentionParam) and (WeeklyRPRetentionDuration > WeeklyRetentionParam) and (MonthlyRPRetentionDuration > MonthlyRetentionParam) and (YearlyRPRetentionDuration > YearlyRetentionParam)\n| project Id, BackupInstance=FriendlyName, Container=DatasourceSetFriendlyName, ResourceGroup=iff(DatasourceType==\"Azure Backup Agent\" or DatasourceType==\"Azure Backup Server\" or DatasourceType==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=Name, DailyRPRetentionDuration, WeeklyRPRetentionDuration, MonthlyRPRetentionDuration, YearlyRPRetentionDuration, Vault=VaultResourceId, AzureResource=DatasourceSetResourceId, DatasourceType\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-Grid3": {
+ "runAfter": {
+ "Run_query_and_list_results-Grid2": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet LatestAzureWorkloadBackupItemDimensionTable = () {union isfuzzy = true \n// calling LA System Function\nBackupInstanceRedirect\n| where BackupSolution in~ (\"SQL in Azure VM Backup\",\"SAP HANA in Azure VM Backup\") \n| join kind = leftouter (\n// calling LA System Function\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Daily\"\n};\nLatestAzureWorkloadBackupItemDimensionTable\n| sort by UniqueId asc \n| project Id, BackupInstance=FriendlyName, Container=DatasourceSetFriendlyName, ResourceGroup=iff(BackupSolution==\"Azure Backup Agent\" or BackupSolution==\"Azure Backup Server\" or BackupSolution==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]\n), Policy=Name, Vault=VaultResourceId, AzureResource=DatasourceSetResourceId, DatasourceType",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT658 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT658
new file mode 100644
index 0000000..14a81a1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT658
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-policies-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-policies-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898730,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-policies-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-policies-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT658",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT658",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT659 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT659
new file mode 100644
index 0000000..8a6ba72
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT659
@@ -0,0 +1,802 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-policies-report/azuredeploy.json",
+ "/demos/backup-policies-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898742,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-policies-report/azuredeploy.json",
+ "/demos/backup-policies-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT659",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT659",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "Policies",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at whch emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "Policies",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "Policies",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "Policies",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "
The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "Policies",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Attachments": [
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-PolicyTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-PolicyTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-CloudStorageTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-CloudStorageTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-PoliciesList'))}",
+ "Name": "ActivePoliciesList.csv"
+ }
+ ],
+ "Body": "
\nPolicies Report
\n
\nEmail Contents
\n
\n1. Inline
a. Trend of active policy count over time
b. Trend of backup cloud storage (GB) consumed over time
2. Attachments
a. List of all backup policies with details on number of associated items, total cloud storage consumed (GB) etc.
Learn more about Backup Reports
\n
\n@{variables('visual')}
\n
\n
\n
\n
\n
",
+ "Subject": "Policies",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForLatestData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n// DatasourceSetType\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true) \n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {union (LatestBackupItemAssociationAndStorageConsumptionTable | where (_RangeEnd-_RangeStart == 1d)), (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceTrendFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceTrendFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Trend')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceTrendFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "visual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForLatestData": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Latest",
+ "type": "string",
+ "value": "let _RangeStart = iff(( datetime(@{parameters('endDate')})== datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('endDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-NoDataMessage": {
+ "inputs": {
+ "variables": [
+ {
+ "name": "NoDataMessage",
+ "type": "array",
+ "value": [
+ {
+ "Message": "No records found"
+ }
+ ]
+ }
+ ]
+ },
+ "runAfter": {
+ "Initialize_variable-EmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable"
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Scope": {
+ "actions": {
+ "Create_CSV_table-PoliciesList": {
+ "runAfter": {
+ "Run_query_and_list_results-PoliciesList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-PoliciesList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-PoliciesList')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-PoliciesList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-CloudStorageTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceFunction')}\n// query to transform function output\n| where PolicyUniqueId != \"\"\n| summarize sum(SourceSizeInMBs), sum(VaultStore_StorageConsumptionInMBs), count(UniqueId), StorageReplicationType = any(VaultStore_StorageReplicationType), PolicyName = any(PolicyName), Vault = any(VaultResourceId), PolicyId = any(PolicyId) by PolicyUniqueId, VaultResourceId\n| project PolicyId, PolicyName, BackupInstances=count_UniqueId, CloudStorage = sum_VaultStore_StorageConsumptionInMBs/1024, Vault, StorageReplicationType, VaultAndPolicyUniqueId = strcat(Vault,PolicyUniqueId)",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-CloudStorageTrend": {
+ "runAfter": {
+ "Run_query_and_visualize_results-PolicyTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| summarize StorageConsumedInGBs = sum(VaultStore_StorageConsumptionInMBs)/(1024) by TimeRangeEndDay = startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-PolicyTrend": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BackupInstanceTrendFunction')}\n// query to transform function output\n| where PolicyUniqueId != \"\"\n| summarize ActivePolicyCount = dcount(strcat(VaultResourceId, PolicyUniqueId), 4) by TimeRangeEndDay = startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Set_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-PoliciesList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "visual",
+ "value": "\n
Active Policy Trend
\n
\n
?['attachmentName']}\")
\n
\n
Cloud Storage Trend
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT66 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT66
new file mode 100644
index 0000000..5486692
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT66
@@ -0,0 +1,426 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-chefserver.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884588,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-chefserver.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT66",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT66",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicIPAddressNameChefServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "publicIPDomainNameLabelChefServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "networkSecurityGroupNameChefServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "networkInterfaceNameChefServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmNameChefServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmAdminUsernameChefServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmAdminPasswordOrPublicKeyChefServer": {
+ "defaultValue": "",
+ "type": "SecureString"
+ },
+ "storageAccountName": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmStorageAccountContainerName": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "network-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "compute-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tagvalues": {
+ "type": "object",
+ "defaultValue": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "publisherChefServer": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "offerChoosedChefServer": {
+ "type": "object",
+ "defaultValue": ""
+ },
+ "subnet2Ref": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefUserName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefUserFirstName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefUserLastName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefUserEmail": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefUserPassword": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "chefOrgShortName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefOrgFullName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "chefServerScriptUrl": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publicIPDomainNameLabelOrchServer": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {
+ "singleQuote": "'",
+ "publicIPDomainNameLabelOrchServer": "http://parameters('publicIPDomainNameLabelOrchServer').westus.cloudapp.azure.com:33001/key",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/ parameters('vmAdminUsernameChefServer')/.ssh/authorized_keys",
+ "keyData": ""
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "",
+ "apiVersion": "2017-03-30",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "plan": {
+ "name": null,
+ "product": null,
+ "publisher": ""
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": null
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "",
+ "offer": null,
+ "sku": null,
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "parameters('vmNameChefServer')-osDisk",
+ "createOption": "FromImage",
+ "caching": "ReadWrite"
+ },
+ "dataDisks": []
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "secrets": [],
+ "adminPassword": "",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/ parameters('networkInterfaceNameChefServer')"
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/ parameters('networkInterfaceNameChefServer')"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('vmNameChefServer')/chefServerSetup",
+ "apiVersion": "2015-05-01-preview",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('vmNameChefServer')"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ ""
+ ],
+ "commandToExecute": "bash chefserver.sh parameters('chefUserName') parameters('chefUserFirstName') parameters('chefUserLastName') parameters('chefUserEmail') ' parameters('chefUserPassword')' parameters('chefOrgShortName') 'parameters('chefOrgFullName')' http://parameters('publicIPDomainNameLabelOrchServer').westus.cloudapp.azure.com:33001/key"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "",
+ "apiVersion": "2017-06-01",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/ parameters('publicIPAddressNameChefServer')"
+ },
+ "subnet": {
+ "id": ""
+ }
+ }
+ }
+ ],
+ "dnsSettings": {
+ "dnsServers": []
+ },
+ "enableIPForwarding": false,
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/ parameters('networkSecurityGroupNameChefServer')"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/ parameters('publicIPAddressNameChefServer')",
+ "Microsoft.Network/networkSecurityGroups/ parameters('networkSecurityGroupNameChefServer')"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "",
+ "apiVersion": "2017-06-01",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1010,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1020,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "https",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1030,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "https8443",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1040,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ },
+ "dependsOn": []
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "",
+ "apiVersion": "2015-06-15",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "",
+ "dnsSettings": {
+ "domainNameLabel": ""
+ },
+ "idleTimeoutInMinutes": 4
+ },
+ "dependsOn": []
+ }
+ ],
+ "outputs": {
+ "chefserverUri": {
+ "type": "string",
+ "value": "[concat('https://',reference(resourceId('Microsoft.Network/publicIPAddresses',parameters('publicIPAddressNameChefServer'))).dnsSettings.fqdn)]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT660 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT660
new file mode 100644
index 0000000..b28cd20
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT660
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-policyadherence-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-policyadherence-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898768,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-policyadherence-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-policyadherence-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT660",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT660",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT661 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT661
new file mode 100644
index 0000000..dfce169
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT661
@@ -0,0 +1,869 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-policyadherence-report/azuredeploy.json",
+ "/demos/backup-policyadherence-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898780,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-policyadherence-report/azuredeploy.json",
+ "/demos/backup-policyadherence-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT661",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT661",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "PolicyAdherence",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at whch emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "Policy Adherence",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "PolicyAdherence",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "Policy Adherence",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "Policy Adherence",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Attachments": [
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-ByBackupInstance-ItemsBackedupDaily'))}",
+ "Name": "PolicyAdherenceByBackupInstance-ItemsBackedupDaily.csv"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-ByBackupInstance-ItemsBackedupWeekly'))}",
+ "Name": "PolicyAdherenceByBackupInstance-ItemsBackedupWeekly.csv"
+ }
+ ],
+ "Body": "
\nPolicy Adherence Report
\n
\nEmail Contents
\n
\n1. Inline
a. Policy Adherence by time period for items backed up daily
b. Policy adherence by time period for items backed up weekly
\n
\n2. Attachments
a. Policy adherence by backup instance for items backed up daily
b. Policy adherence by backup instance for items backed up weekly
Learn more about Backup Reports
\n
\n@{variables('visual')}
\n
\n
\n
\n
\n
",
+ "Subject": "Policy Adherence",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceFunction": {
+ "runAfter": {
+ "Initialize_variable-JobFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n// DatasourceSetType\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true) \n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {union (LatestBackupItemAssociationAndStorageConsumptionTable | where (_RangeEnd-_RangeStart == 1d)), (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceTrendFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceTrendFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Trend')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-PolicyFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "visual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-NoDataMessage": {
+ "inputs": {
+ "variables": [
+ {
+ "name": "NoDataMessage",
+ "type": "array",
+ "value": [
+ {
+ "Message": "No records found"
+ }
+ ]
+ }
+ ]
+ },
+ "runAfter": {
+ "Initialize_variable-EmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable"
+ },
+ "Initialize_variable-JobFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "JobFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n// Report filters\n@{variables('ReportFilter_Trend')}\nlet _ProtectionStateList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _JobOperationList = \"*\";\nlet _JobStatusList = \"*\";\nlet _JobFailureCodeList = \"*\";\nlet _ExcludeLog = true;\n// Other Vars\nlet ExtRangeStart = _RangeStart - 2d;\nlet ExtRangeEnd = _RangeEnd + 2d;\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet JobUnderAzureDiagnostics = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AzureDiagnostics \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"Job\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n// Exclude Log Jobs and InProgress Jobs\n| project JobOperation = columnifexists(\"JobOperation_s\", \"\") , JobOperationSubType = columnifexists(\"JobOperationSubType_s\", \"\"), JobUniqueIdGuid = columnifexists(\"JobUniqueId_g\", \"\") , JobUniqueIdStr = columnifexists(\"JobUniqueId_s\", \"\"),\nProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), AdHocOrScheduledJob = columnifexists(\"AdHocOrScheduledJob_s\",\"\"), RecoveryJobDestination = columnifexists(\"RecoveryJobDestination_s\",\"\"),\nRecoveryJobRPDateTime = todatetime(columnifexists(\"RecoveryJobRPDateTime_s\",\"\")), RecoveryJobRPLocation = columnifexists(\"RecoveryJobRPLocation_s\",\"\"), RecoveryLocationType = columnifexists(\"RecoveryLocationType_s\",\"\"),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\",\"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\",\"\"),\nJobStatus = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode = columnifexists(\"JobFailureCode_s\",\"\"), JobStartDateTime = todatetime(columnifexists(\"JobStartDateTime_s\",\"\")), JobDurationInSecs = todouble(columnifexists(\"JobDurationInSecs_s\", \"\")),\nDataTransferredInMB = todouble(columnifexists(\"DataTransferredInMB_s\",\"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\",\"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog) \n| extend JobUniqueId = iff(JobUniqueIdGuid == \"\", JobUniqueIdStr, JobUniqueIdGuid) \n| project-away JobUniqueIdGuid, JobUniqueIdStr\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId ;\nJobTable\n};\nlet JobUnderResourceSpecific = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AddonAzureBackupJobs \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Job\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog)\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId;\nJobTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet LatestBackupItemWithProtectedContainerTable = () \n{\nTotalBackupItemDimensionTable\n| join (union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics()| where _ExcludeLegacyEvent == false),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId) on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet JobFinalTable = (){\n union isfuzzy = true \n(JobUnderAzureDiagnostics(true)| where _ExcludeLegacyEvent == false),\n(JobUnderResourceSpecific(true))\n| project JobStatus, JobUniqueId, JobOperation, JobFailureCode, JobOperationSubType, JobStartDateTime, DataTransferredInMB, AdHocOrScheduledJob, JobDurationInSecs, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId, ProtectedContainerUniqueId, TimeGenerated \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId\n| where JobOperation in~ (_JobOperationList) or '*' in (_JobOperationList)\n| where JobStatus in~ (_JobStatusList) or '*' in (_JobStatusList)\n| where JobFailureCode in~ (_JobFailureCodeList) or '*' in (_JobFailureCodeList)\n| join kind= inner (LatestBackupItemWithProtectedContainerTable) on BackupItemUniqueId\n| project JobUniqueId, JobOperation, JobStatus, JobFailureCode, JobOperationSubType, JobStartDateTime, JobDurationInSecs, DataTransferredInMB, AdHocOrScheduledJob, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId = BackupItemUniqueId1, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, StorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(JobFinalTable)))\n| project UniqueId = JobUniqueId, OperationCategory = JobOperation, Operation = JobOperationSubType, Status = JobStatus, ErrorTitle = JobFailureCode, StartTime = JobStartDateTime, DurationInSecs = JobDurationInSecs, DataTransferredInMBs = DataTransferredInMB, RestoreJobRPDateTime = RecoveryJobRPDateTime, RestoreJobRPLocation = RecoveryJobRPLocation, BackupInstanceUniqueId = BackupItemUniqueId, BackupInstanceId, BackupInstanceFriendlyName = BackupItemFriendlyName, DatasourceResourceId, DatasourceFriendlyName = BackupItemFriendlyName, DatasourceType, BackupSolution, DatasourceSetResourceId, DatasourceSetType, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-PolicyFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceTrendFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "PolicyFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')} \n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet PolicyWithExtendedPropsUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), PolicyTimeZone = columnifexists(\"PolicyTimeZone_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), DiffBackupFormat = columnifexists(\"DiffBackupFormat_s\", \"\"),\nDiffBackupDaysofTheWeek = columnifexists(\"DiffBackupDaysofTheWeek_s\", \"\"), DiffBackupRetentionDuration = toint(columnifexists(\"DiffBackupRetentionDuration_s\", \"\")), DiffBackupTime = columnifexists(\"DiffBackupTime_s\", \"\"), LogBackupFrequency = toint(columnifexists(\"LogBackupFrequency_s\", \"\")), LogBackupRetentionDuration = toint(columnifexists(\"LogBackupRetentionDuration_s\", \"\")),\nBackupFrequency = columnifexists(\"BackupFrequency_s\", \"\"), BackupTimes = columnifexists(\"BackupTimes_s\", \"\"), BackupDaysOfTheWeek = columnifexists(\"BackupDaysOfTheWeek_s\", \"\"), RetentionType = columnifexists(\"RetentionType_s\", \"\"), RetentionDuration = toint(columnifexists(\"RetentionDuration_s\", \"\")),\nDailyRetentionDuration = toint(columnifexists(\"DailyRetentionDuration_s\", \"\")), DailyRetentionTimes = columnifexists(\"DailyRetentionTimes_s\", \"\"), \nWeeklyRetentionDuration = toint(columnifexists(\"WeeklyRetentionDuration_s\", \"\")), WeeklyRetentionTimes = columnifexists(\"WeeklyRetentionTimes_s\", \"\"), WeeklyRetentionDaysOfTheWeek = columnifexists(\"WeeklyRetentionDaysOfTheWeek_s\", \"\"),\nMonthlyRetentionDuration = toint(columnifexists(\"MonthlyRetentionDuration_s\", \"\")), MonthlyRetentionTimes = columnifexists(\"MonthlyRetentionTimes_s\", \"\"), MonthlyRetentionFormat = columnifexists(\"MonthlyRetentionFormat_s\", \"\"), MonthlyRetentionDaysOfTheMonth = columnifexists(\"MonthlyRetentionDaysOfTheMonth_s\", \"\"), MonthlyRetentionDaysOfTheWeek = columnifexists(\"MonthlyRetentionDaysOfTheWeek_s\", \"\"), MonthlyRetentionWeeksOfTheMonth = columnifexists(\"MonthlyRetentionWeeksOfTheMonth_s\", \"\"),\nYearlyRetentionDuration = toint(columnifexists(\"YearlyRetentionDuration_s\", \"\")), YearlyRetentionTimes = columnifexists(\"YearlyRetentionTimes_s\", \"\"), YearlyRetentionMonthsOfTheYear = columnifexists(\"YearlyRetentionMonthsOfTheYear_s\", \"\"), YearlyRetentionFormat = columnifexists(\"YearlyRetentionFormat_s\", \"\"), YearlyRetentionDaysOfTheMonth = columnifexists(\"YearlyRetentionDaysOfTheMonth_s\", \"\"), YearlyRetentionDaysOfTheWeek = columnifexists(\"YearlyRetentionDaysOfTheWeek_s\", \"\"), YearlyRetentionWeeksOfTheMonth = columnifexists(\"YearlyRetentionWeeksOfTheMonth_s\", \"\"), ResourceId, TimeGenerated\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), ResourceId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated;\n PolicyTable \n};\nlet PolicyWithExtendedPropsUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where OperationName == \"Policy\" \n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated;\n PolicyTable \n};\nlet PolicyHistoryWithExtendedPropsUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), PolicyTimeZone = columnifexists(\"PolicyTimeZone_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), DiffBackupFormat = columnifexists(\"DiffBackupFormat_s\", \"\"),\nDiffBackupDaysofTheWeek = columnifexists(\"DiffBackupDaysofTheWeek_s\", \"\"), DiffBackupRetentionDuration = toint(columnifexists(\"DiffBackupRetentionDuration_s\", \"\")), DiffBackupTime = columnifexists(\"DiffBackupTime_s\", \"\"), LogBackupFrequency = toint(columnifexists(\"LogBackupFrequency_s\", \"\")), LogBackupRetentionDuration = toint(columnifexists(\"LogBackupRetentionDuration_s\", \"\")),\nBackupFrequency = columnifexists(\"BackupFrequency_s\", \"\"), BackupTimes = columnifexists(\"BackupTimes_s\", \"\"), BackupDaysOfTheWeek = columnifexists(\"BackupDaysOfTheWeek_s\", \"\"), RetentionType = columnifexists(\"RetentionType_s\", \"\"), RetentionDuration = toint(columnifexists(\"RetentionDuration_s\", \"\")),\nDailyRetentionDuration = toint(columnifexists(\"DailyRetentionDuration_s\", \"\")), DailyRetentionTimes = columnifexists(\"DailyRetentionTimes_s\", \"\"), \nWeeklyRetentionDuration = toint(columnifexists(\"WeeklyRetentionDuration_s\", \"\")), WeeklyRetentionTimes = columnifexists(\"WeeklyRetentionTimes_s\", \"\"), WeeklyRetentionDaysOfTheWeek = columnifexists(\"WeeklyRetentionDaysOfTheWeek_s\", \"\"),\nMonthlyRetentionDuration = toint(columnifexists(\"MonthlyRetentionDuration_s\", \"\")), MonthlyRetentionTimes = columnifexists(\"MonthlyRetentionTimes_s\", \"\"), MonthlyRetentionFormat = columnifexists(\"MonthlyRetentionFormat_s\", \"\"), MonthlyRetentionDaysOfTheMonth = columnifexists(\"MonthlyRetentionDaysOfTheMonth_s\", \"\"), MonthlyRetentionDaysOfTheWeek = columnifexists(\"MonthlyRetentionDaysOfTheWeek_s\", \"\"), MonthlyRetentionWeeksOfTheMonth = columnifexists(\"MonthlyRetentionWeeksOfTheMonth_s\", \"\"),\nYearlyRetentionDuration = toint(columnifexists(\"YearlyRetentionDuration_s\", \"\")), YearlyRetentionTimes = columnifexists(\"YearlyRetentionTimes_s\", \"\"), YearlyRetentionMonthsOfTheYear = columnifexists(\"YearlyRetentionMonthsOfTheYear_s\", \"\"), YearlyRetentionFormat = columnifexists(\"YearlyRetentionFormat_s\", \"\"), YearlyRetentionDaysOfTheMonth = columnifexists(\"YearlyRetentionDaysOfTheMonth_s\", \"\"), YearlyRetentionDaysOfTheWeek = columnifexists(\"YearlyRetentionDaysOfTheWeek_s\", \"\"), YearlyRetentionWeeksOfTheMonth = columnifexists(\"YearlyRetentionWeeksOfTheMonth_s\", \"\"), ResourceId, TimeGenerated\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), ResourceId, TimeRangeEndDay = startofday(TimeGenerated)\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\nPolicyTable\n};\nlet PolicyHistoryWithExtendedPropsUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId, TimeRangeEndDay = startofday(TimeGenerated)\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n PolicyTable \n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\n// Business Logic\nlet ActivePolicyUnderAzureDiagnostics = ()\n{\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderAzureDiagnostics() | join kind = inner\n\t(BackupItemAssociationUnderAzureDiagnostics() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter\n\t| join kind= inner (\n\t PolicyWithExtendedPropsUnderAzureDiagnostics ) on ResourceId, PolicyUniqueId\n| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated;\n\t};\nBIA_Policy\n};\nlet ActivePolicyUnderResourceSpecific = ()\n{\t\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderResourceSpecific() | join kind = inner\n\t(BackupItemAssociationUnderResourceSpecific() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter\n\t| join kind= inner (\n\t PolicyWithExtendedPropsUnderResourceSpecific ) on ResourceId, PolicyUniqueId\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated;\n\t};\nBIA_Policy\n};\nlet ActivePolicyHistoryUnderAzureDiagnostics = ()\n{\t\n\tlet BIA_Policy = ()\n\t{\n\tBackupItemUnderAzureDiagnostics() | join kind = inner\n\t(BackupItemAssociationHistoryUnderAzureDiagnostics() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeRangeEndDay\t\n\t| join kind= inner (\n\t PolicyHistoryWithExtendedPropsUnderAzureDiagnostics ) on ResourceId, PolicyUniqueId, TimeRangeEndDay\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n\t};\nBIA_Policy\n};\nlet ActivePolicyHistoryUnderResourceSpecific = ()\n{\t\t\n\tlet BIA_Policy = ()\n\t{\t\n\tBackupItemUnderResourceSpecific() | join kind = inner\n\t(BackupItemAssociationHistoryUnderResourceSpecific() ) on BackupItemUniqueId\n\t| project BackupItemUniqueId, BackupItemType, BackupSolution, ResourceId, PolicyUniqueId, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeRangeEndDay\n\t| join kind= inner (\n\t PolicyHistoryWithExtendedPropsUnderResourceSpecific ) on ResourceId, PolicyUniqueId, TimeRangeEndDay\n\t| project PolicyUniqueId, PolicyName, PolicyTimeZone, DiffBackupFormat, DiffBackupDaysofTheWeek, DiffBackupRetentionDuration,\nDiffBackupTime, LogBackupFrequency, LogBackupRetentionDuration, BackupFrequency, BackupTimes, BackupDaysOfTheWeek, RetentionType, RetentionDuration, DailyRetentionDuration, DailyRetentionTimes, WeeklyRetentionDuration, WeeklyRetentionTimes, WeeklyRetentionDaysOfTheWeek, MonthlyRetentionDuration, MonthlyRetentionTimes, MonthlyRetentionFormat, MonthlyRetentionDaysOfTheMonth, MonthlyRetentionDaysOfTheWeek, MonthlyRetentionWeeksOfTheMonth, YearlyRetentionDuration, YearlyRetentionTimes, YearlyRetentionMonthsOfTheYear, YearlyRetentionFormat, YearlyRetentionDaysOfTheMonth, YearlyRetentionDaysOfTheWeek, YearlyRetentionWeeksOfTheMonth, StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, BackupItemUniqueId, BackupItemType, BackupSolution, BackupManagementType, ResourceId, TimeGenerated, TimeRangeEndDay;\n\t};\nBIA_Policy\n};\nlet PolicyExtended_LatestTable = () {\nunion\n(ActivePolicyUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ActivePolicyUnderResourceSpecific())\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId};\nlet PolicyExtended_HistoryTable = () {\nunion\n(ActivePolicyHistoryUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ActivePolicyHistoryUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId, TimeRangeEndDay};\nlet FinalTable_V1Vault = () {union (PolicyExtended_LatestTable | where (_RangeEnd-_RangeStart == 1d)), (PolicyExtended_HistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project UniqueId = PolicyUniqueId, Name = PolicyName, TimeZone = PolicyTimeZone, Id = strcat(ResourceId, \"/backupPolicies/\", PolicyName), \nBackupFrequency = iff(isnotempty(BackupFrequency), pack(\"BackupFrequency\", BackupFrequency), dynamic(null)),\nDiffBackupFormat = iff(isnotempty(DiffBackupFormat), pack(\"DiffBackupFormat\", DiffBackupFormat), dynamic(null)),\nLogBackupFrequency = iff(isnotempty(LogBackupFrequency), pack(\"LogBackupFrequency\", LogBackupFrequency), dynamic(null)),\nDailyRetentionDuration = iff(isnotempty(DailyRetentionDuration), pack(\"DailyRetentionDuration\", DailyRetentionDuration), dynamic(null)),\nWeeklyRetentionDuration = iff(isnotempty(WeeklyRetentionDuration), pack(\"WeeklyRetentionDuration\", WeeklyRetentionDuration), dynamic(null)),\nMonthlyRetentionDuration = iff(isnotempty(MonthlyRetentionDuration), pack(\"MonthlyRetentionDuration\", MonthlyRetentionDuration), dynamic(null)),\nYearlyRetentionDuration = iff(isnotempty(YearlyRetentionDuration), pack(\"YearlyRetentionDuration\", YearlyRetentionDuration), dynamic(null)),\nDiffBackupRetentionDuration = iff(isnotempty(DiffBackupRetentionDuration), pack(\"DiffBackupRetentionDuration\", DiffBackupRetentionDuration), dynamic(null)),\nLogBackupRetentionDuration = iff(isnotempty(LogBackupRetentionDuration), pack(\"LogBackupRetentionDuration\", LogBackupRetentionDuration), dynamic(null)),\nBackupSolution, TimeGenerated, VaultUniqueId, VaultResourceId = ResourceId, VaultName, VaultTags, VaultLocation = AzureDataCenter, VaultSubscriptionId = SubscriptionId, VaultStore_StorageReplicationType = StorageReplicationType,VaultType = \"Microsoft.Recoveryservices/vaults\"\n| project UniqueId, Name, TimeZone, Id, BackupSolution, TimeGenerated, VaultUniqueId, VaultResourceId, VaultName, VaultTags, VaultLocation, VaultSubscriptionId, VaultStore_StorageReplicationType, VaultType, ExtendedProperties = bag_merge(BackupFrequency, DiffBackupFormat, LogBackupFrequency, DailyRetentionDuration, WeeklyRetentionDuration, MonthlyRetentionDuration, YearlyRetentionDuration, DiffBackupRetentionDuration, LogBackupRetentionDuration)\n};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForLatestData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForLatestData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Latest",
+ "type": "string",
+ "value": "let _RangeStart = iff(( datetime(@{parameters('endDate')})== datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('endDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Scope": {
+ "actions": {
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupDaily": {
+ "runAfter": {
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily')?['value'])"
+ }
+ },
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupWeekly": {
+ "runAfter": {
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupDaily": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily": {
+ "runAfter": {
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupWeekly": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\n// Grid specific params\nlet bin_Value = iff(aggregationTypeParam == \"Weekly\", 7d, iff(aggregationTypeParam == \"Monthly\", 28d, 1d));\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Weekly\", \"7\", iff(aggregationTypeParam == \"Monthly\", \"28\", \"1\")); \nlet duration_Value = iff(aggregationTypeParam == \"Weekly\", \"6.00:00:00\", iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"00.00:00:00\")); \nlet BackupInstanceWithDailyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\n// calling LA System Function\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Daily\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithDailyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount = count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId=any(BackupInstanceId), BackupSolution = any(BackupSolution), DatasourceSetResourceId = any(DatasourceSetResourceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName) by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n| project ResourceGroup=iff(BackupSolution ==\"Azure Backup Agent\" or BackupSolution ==\"Azure Backup Server\" or BackupSolution ==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]), jobCount, jobSuccessCount, BackupInstanceFriendlyName, BackupInstanceUniqueId, DatasourceSetFriendlyName, JobCreationDate, BackupInstanceId\n};\nJobInfo\n| summarize by BackupInstanceUniqueId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, BackupInstanceId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, BackupInstanceFriendlyName, BackupInstanceId, DatasourceSetFriendlyName, ResourceGroup, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n| sort by BackupInstanceUniqueId, Day desc\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Day, jobTotalCountInTheTimePeriod = iff(isnull(jobCount), 0, jobCount), isJobSuccessInTheTimePeriod =iff(isnull(jobCount), 0, iff((jobSuccessCount > 1), 1, jobSuccessCount))\n| summarize max(Day), min(Day), sum(isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName),BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, bin_at(Day, bin_Value, RangeEnd + 1d)\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Period = iff(aggregationTypeParam == \"Weekly\" or aggregationTypeParam == \"Monthly\", strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), format_datetime(todatetime(min_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize sum_isJobSuccessInTheTimePeriod = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, Period\n| evaluate pivot(Period, any(sum_isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName, BackupInstanceId, BackupInstanceUniqueId, DatasourceSetFriendlyName, ResourceGroup)\n| sort by BackupInstanceUniqueId asc",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupWeekly": {
+ "runAfter": {
+ "Run_query_and_list_results-ByBackupInstance-ItemsBackedupDaily": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\n// Grid specific params\nlet bin_Value = iff(aggregationTypeParam == \"Monthly\", 28d, 7d);\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Monthly\", \"4\", \"1\"); \nlet duration_Value = iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"6.00:00:00\"); \nlet BackupInstanceWithWeeklyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Weekly\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithWeeklyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount = count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), BackupSolution = any(BackupSolution), DatasourceSetResourceId = any(DatasourceSetResourceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName) by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n| project ResourceGroup=iff(BackupSolution ==\"Azure Backup Agent\" or BackupSolution ==\"Azure Backup Server\" or BackupSolution ==\"DPM\",\"(none)\",split(split(tostring(tolower(DatasourceSetResourceId)), '/resourcegroups/')[1],'/')[0]), jobCount, jobSuccessCount, BackupInstanceFriendlyName, BackupInstanceUniqueId, DatasourceSetFriendlyName, JobCreationDate, BackupInstanceId\n};\nJobInfo\n| summarize by BackupInstanceUniqueId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, BackupInstanceId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n| sort by BackupInstanceUniqueId, Day desc\n// Create weekly buckets to check if SLA met\n| summarize max(Day), min(Day), sum(jobSuccessCount), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName),BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, bin_at(Day, 7d, RangeEnd + 1d)\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Day, sum_isJobSuccessInTheTimePeriod = iff(sum_jobSuccessCount > 1, 1, sum_jobSuccessCount), max_Day, min_Day\n| summarize max_Day = max(max_Day), min_Day = min(min_Day), sum_isJobSuccessInTheTimePeriod = sum(sum_isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, Day = bin_at(Day, bin_Value, RangeEnd + 1d)\n| project BackupInstanceUniqueId, BackupInstanceId, BackupInstanceFriendlyName, DatasourceSetFriendlyName, ResourceGroup, Period = strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize sum_isJobSuccessInTheTimePeriod = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), BackupInstanceFriendlyName = any(BackupInstanceFriendlyName), BackupInstanceId = any(BackupInstanceId), DatasourceSetFriendlyName = any(DatasourceSetFriendlyName), ResourceGroup = any(ResourceGroup) by BackupInstanceUniqueId, Period\n| evaluate pivot(Period, any(sum_isJobSuccessInTheTimePeriod), BackupInstanceFriendlyName, BackupInstanceId, BackupInstanceUniqueId, DatasourceSetFriendlyName, ResourceGroup)\n| sort by BackupInstanceUniqueId asc",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupDaily": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\n// Grid specific params\nlet bin_Value = iff(aggregationTypeParam == \"Weekly\", 7d, iff(aggregationTypeParam == \"Monthly\", 28d, 1d));\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Weekly\", \"7\", iff(aggregationTypeParam == \"Monthly\", \"28\", \"1\")); \nlet duration_Value = iff(aggregationTypeParam == \"Weekly\", \"6.00:00:00\", iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"00.00:00:00\")); \nlet BackupInstanceWithDailyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Daily\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\n// calling LA System Function\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithDailyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount =count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), jobFailureCount = countif(Status == \"Failed\" or Status == \"Cancelled\") by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n};\nJobInfo\n| summarize by BackupInstanceUniqueId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n// calculating isJobSuccess in the timeperiod to determine if it is successfull throughout the timeperiod\n| project BackupInstanceUniqueId, Day, isJobSuccessInTheTimePeriod =iff(isnull(jobCount), 0, iff((jobSuccessCount > 1), 1, jobSuccessCount)), jobFailureCount\n| summarize max(Day), min(Day), sum(isJobSuccessInTheTimePeriod), sum(jobFailureCount) by BackupInstanceUniqueId, bin_at(Day, bin_Value, RangeEnd + 1d)\n//| where BackupInstanceUniqueId in (\"westus;1541146419693764636;iaasvmcontainerv2;arult-test;cvarshrbac\",\"southeastasia;7777938885731870052;iaasvmcontainerv2;trinadhkselfhostrg;databasevm8\")\n| project BackupInstanceUniqueId, Period = iff(aggregationTypeParam == \"Weekly\" or aggregationTypeParam == \"Monthly\", strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), format_datetime(todatetime(min_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, sum_jobFailureCount, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize ItemsWithSuccessfulDailyBackup = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), ItemsWithoutSuccessfulDailyBackup = countif(sum_isJobSuccessInTheTimePeriod != sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), sum_jobFailureCount = any(sum_jobFailureCount) by BackupInstanceUniqueId, Period\n| summarize ItemsWithSuccessfulDailyBackup = sum(ItemsWithSuccessfulDailyBackup), ItemsWithoutSuccessfulDailyBackup = sum(ItemsWithoutSuccessfulDailyBackup), FailedBackupJobs = sum(sum_jobFailureCount), RangeStartValue = (any(Day)) by Period\n| sort by RangeStartValue desc | project-away RangeStartValue",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Html Table"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupWeekly": {
+ "runAfter": {
+ "Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupDaily": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let RangeStart = startofday(datetime(@{parameters('startDate')}));\nlet RangeEnd = startofday(datetime(@{parameters('endDate')}));\nlet aggregationTypeParam = @{parameters('aggregationType')};\nlet BackupInstanceRedirect = ()\n{\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n};\nlet PolicyFunctionRedirect = ()\n{\n@{variables('PolicyFunction')}\n};\nlet JobFunctionRedirect = ()\n{\n@{variables('JobFunction')}\n| where OperationCategory == \"Backup\"\n};\nlet bin_Value = iff(aggregationTypeParam == \"Monthly\", 28d, 7d);\nlet sum_isJobSuccessInTheTimePeriod_Value = iff(aggregationTypeParam == \"Monthly\", \"4\", \"1\"); \nlet duration_Value = iff(aggregationTypeParam == \"Monthly\", \"27.00:00:00\", \"6.00:00:00\"); \nlet BackupInstanceWithWeeklyBackup = (){\nBackupInstanceRedirect\n| join kind = inner (\nPolicyFunctionRedirect\n) on $left.PolicyUniqueId == $right.UniqueId, $left.VaultResourceId == $right.VaultResourceId\n| where parse_json(ExtendedProperties).BackupFrequency == \"Weekly\"\n};\n// Grid Logic\nlet JobInfo = ()\n{\nJobFunctionRedirect\n| join kind = inner (BackupInstanceWithWeeklyBackup) on $left.BackupInstanceUniqueId == $right.UniqueId\n| summarize jobCount =count(), jobSuccessCount = countif(Status == \"Completed\" or Status == \"CompletedWithWarnings\"), jobFailureCount = countif(Status == \"Failed\" or Status == \"Cancelled\") by BackupInstanceUniqueId, JobCreationDate = startofday(StartTime)\n};\nJobInfo\n| summarize by BackupInstanceUniqueId\n| extend Day = range(RangeEnd, RangeStart, -1d)\n| mv-expand Day\n| project BackupInstanceUniqueId, todatetime(Day)\n| join kind = leftouter \n( JobInfo\n) on BackupInstanceUniqueId, $left.Day == $right.JobCreationDate\n// Create weekly buckets to check if SLA met\n| summarize max(Day), min(Day), sum(jobSuccessCount), sum(jobFailureCount) by BackupInstanceUniqueId, bin_at(Day, 7d, RangeEnd + 1d)\n| project BackupInstanceUniqueId, Day, sum_isJobSuccessInTheTimePeriod = iff(sum_jobSuccessCount > 1, 1, sum_jobSuccessCount), sum_jobFailureCount, max_Day, min_Day\n| summarize max_Day = max(max_Day), min_Day = min(min_Day), sum_isJobSuccessInTheTimePeriod = sum(sum_isJobSuccessInTheTimePeriod), sum_jobFailureCount = sum(sum_jobFailureCount) by BackupInstanceUniqueId, Day = bin_at(Day, bin_Value, RangeEnd + 1d)\n| project BackupInstanceUniqueId, Period = strcat(format_datetime(todatetime(min_Day),\"yyyy/MM/dd\"), \" - \", format_datetime(todatetime(max_Day),\"yyyy/MM/dd\")), sum_isJobSuccessInTheTimePeriod, sum_jobFailureCount, duration = max_Day - min_Day, Day\n// Exclude partial week/month\n| where duration == duration_Value\n| summarize ItemsWithSuccessfulWeeklyBackup = countif(sum_isJobSuccessInTheTimePeriod == sum_isJobSuccessInTheTimePeriod_Value), ItemsWithoutSuccessfulWeeklyBackup = countif(sum_isJobSuccessInTheTimePeriod != sum_isJobSuccessInTheTimePeriod_Value), Day= (any(Day)), sum_jobFailureCount = any(sum_jobFailureCount) by BackupInstanceUniqueId, Period\n| summarize ItemsWithSuccessfulWeeklyBackup = sum(ItemsWithSuccessfulWeeklyBackup), ItemsWithoutSuccessfulWeeklyBackup = sum(ItemsWithoutSuccessfulWeeklyBackup), FailedBackupJobs = sum(sum_jobFailureCount), RangeStartValue = (any(Day)) by Period\n| sort by RangeStartValue desc | project-away RangeStartValue\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "WonderDemoMonitoringRG",
+ "resourcename": "WonderDemoMonitoring",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "ef4ab5a7-c2c0-4304-af80-af49f48af3d1",
+ "timerange": "Set in query",
+ "visType": "Html Table"
+ }
+ }
+ },
+ "Set_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-ByBackupInstance-ItemsBackedupWeekly": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "visual",
+ "value": "\n
Policy Adherence By Time Period - Items Backed up Daily
\n@{base64ToString(body('Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupDaily')?['body'])}\n Policy Adherence By Time Period - Items Backed up Weekly
\n@{base64ToString(body('Run_query_and_visualize_results-ByTimePeriod-ItemsBackedupWeekly')?['body'])}\n"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT662 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT662
new file mode 100644
index 0000000..f4758c8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT662
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-summary-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-summary-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898793,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-summary-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-summary-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT662",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT662",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT663 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT663
new file mode 100644
index 0000000..263bf9d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT663
@@ -0,0 +1,676 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-summary-report/azuredeploy.json",
+ "/demos/backup-summary-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898802,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-summary-report/azuredeploy.json",
+ "/demos/backup-summary-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT663",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT663",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "Summary",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at which emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "Summary",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "Summary",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "Summary",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "Summary",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "
\nBackup Reports - Summary
\n
\nEmail Contents
\n
\n1. Inline
a. Key parameters by Backup Solution
Learn more about Backup Reports
\n
\n@{base64ToString(body('Run_query_and_visualize_results-SummaryGrid')?['body'])}
\n
\n
",
+ "Subject": "Summary",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BackupInstanceFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForLatestData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BackupInstanceFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _ProtectionInfoList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _DisplayAllFields = true;\n// Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureBackupServer\", iff(BackupItemType == \"SQLDB\",\"SQLDataBase\",BackupItemType), \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n// DatasourceSetType\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet RecoveryPointUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderAzureDiagnostics = ()\n{\n let RecoveryPointTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"RecoveryPoint\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project LatestRecoveryPointLocation = columnifexists(\"LatestRecoveryPointLocation_s\", \"\"), OldestRecoveryPointLocation = columnifexists(\"OldestRecoveryPointLocation_s\", \"\"), LatestRecoveryPointTime = todatetime(columnifexists(\"LatestRecoveryPointTime_s\", \"\")), OldestRecoveryPointTime = todatetime(columnifexists(\"OldestRecoveryPointTime_s\", \"\")),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet RecoveryPointHistoryUnderResourceSpecific = ()\n{\n let RecoveryPointTable = CoreAzureBackup \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"RecoveryPoint\" and State != \"Deleted\"\n| project LatestRecoveryPointLocation, OldestRecoveryPointLocation, LatestRecoveryPointTime, OldestRecoveryPointTime,\nBackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n// Interested in only Vault/Cloud RPs\n| where LatestRecoveryPointLocation has \"Cloud\" \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nRecoveryPointTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet JoinWithRP = (T:(BackupItemUniqueId:string))\n{\nT | join kind= leftouter (\n RecoveryPointUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime) on BackupItemUniqueId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nlet Base_RP = ()\n{\nJoinWithRP(Base)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Policy_RP = ()\n{\nJoinWithRP(Base_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_RP = ()\n{\nJoinWithRP(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy = ()\n{\nJoinWithPolicy(Base_Size)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nlet Base_Size_Policy_RP = ()\n{\nJoinWithRP(Base_Size_Policy)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, ResourceId\n};\nunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true) \n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderAzureDiagnostics | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n\t{\n\tT | join kind= leftouter (\n\t PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n\t};\n\tlet JoinWithRP = (T:(BackupItemUniqueId:string, TimeRangeEndDay:datetime))\n\t{\n\tT | join kind= leftouter (\n\t RecoveryPointHistoryUnderResourceSpecific | project BackupItemUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeRangeEndDay) on BackupItemUniqueId, TimeRangeEndDay\n\t};\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy = ()\n\t{\n\tJoinWithPolicy(Base) \n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_RP = ()\n\t{\n\tJoinWithRP(Base)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_RP = ()\n\t{\n\tJoinWithRP(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy = ()\n\t{\n\tJoinWithPolicy(Base_Size)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size_Policy_RP = ()\n\t{\n\tJoinWithRP(Base_Size_Policy)\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName,BackupItemFrontEndSize, StorageConsumedInMBs, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tunion ( Base | where _DisplayAllFields == false ),\t \n\t ( Base_Size_Policy_RP | where _DisplayAllFields== true)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = ()\n//let partition_data = (p:long, n:long)\n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_HistoryCombinationUnderResourceSpecific())\n//| where hash(BackupItemUniqueId, n) == p\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false\n),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, VaultUniqueId,\nVaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime\n};\nlet FinalTable = () {union (LatestBackupItemAssociationAndStorageConsumptionTable | where (_RangeEnd-_RangeStart == 1d)), (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where (_RangeEnd-_RangeStart > 1d))\n| project BackupItemName, BackupItemFriendlyName, BackupItemProtectionState, PolicyUniqueId, PolicyName = iff(BackupItemProtectionState == \"ProtectionStopped\", \"(none)\", PolicyName), SubscriptionId, ResourceGroupName, AzureDataCenter, VaultUniqueId, VaultName, VaultTags, BackupManagementType, BackupItemType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), StorageConsumedInMBs), ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupItemUniqueId, StorageReplicationType, OldestRecoveryPointTime, LatestRecoveryPointTime, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(FinalTable)))\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| project UniqueId = BackupItemUniqueId, Id = BackupInstanceId, FriendlyName = BackupItemFriendlyName, ProtectionInfo = BackupItemProtectionState, LatestRecoveryPoint = LatestRecoveryPointTime, OldestRecoveryPoint = OldestRecoveryPointTime, SourceSizeInMBs = BackupItemFrontEndSize, VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, DataSourceFriendlyName = BackupItemFriendlyName, BackupSolution, DatasourceType, DatasourceResourceId, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, DatasourceSetResourceId, DatasourceSetType, PolicyName, PolicyUniqueId, PolicyId = strcat(ResourceId, \"/backupPolicies/\", PolicyName), VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultStore_StorageReplicationType = StorageReplicationType, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-JobFunction": {
+ "runAfter": {
+ "Initialize_variable-BackupInstanceFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "JobFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n// Report filters\n@{variables('ReportFilter_Trend')}\nlet _ProtectionStateList = \"*\";\nlet _DatasourceSetName = \"*\";\nlet _BackupInstanceName = \"*\";\nlet _JobOperationList = \"*\";\nlet _JobStatusList = \"*\";\nlet _JobFailureCodeList = \"*\";\nlet _ExcludeLog = true;\n// Other Vars\nlet ExtRangeStart = _RangeStart - 2d;\nlet ExtRangeEnd = _RangeEnd + 2d;\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\nlet Extend_DatasourceType = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend DatasourceType = iff(BackupManagementType == \"IaaSVM\", \"Microsoft.Compute/virtualMachines\", \niff(BackupManagementType == \"MAB\", BackupItemType, \niff(BackupManagementType == \"DPM\", BackupItemType, \niff(BackupManagementType == \"AzureBackupServer\", BackupItemType, \niff(BackupManagementType == \"AzureStorage\", \"Microsoft.Storage/storageAccounts/fileServices/shares\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQLDataBase\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAPHanaDatabase\", \"\")))))))\n};\nlet Extend_BackupInstanceId = (T:(ResourceId:string, BackupManagementType:string, BackupItemType:string, ProtectedContainerName:string, BackupItemName:string))\n{\nT | extend BackupInstanceId = toupper(iff ((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/IaasVMContainer;\", ProtectedContainerName, \"/protectedItems/VM;\", ProtectedContainerName),\niff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/StorageContainer;\", ProtectedContainerName, \"/protectedItems/AzureFileShare;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SQLDataBase;\", BackupItemName) , \niff((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\"), strcat(ResourceId,\"/backupFabrics/Azure/protectionContainers/VMAppContainer;\", ProtectedContainerName, \"/protectedItems/SAPHanaDatabase;\", BackupItemName), \"\")))))\n};\nlet Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId = (T:(ResourceId:string, ProtectedContainerName:string, BackupManagementType:string, BackupItemType:string, BackupItemUniqueId:string, BackupItemName:string, BackupItemFriendlyName:string))\n{\nT | extend prefix = array_strcat(array_split(split(ResourceId,\"/\"), 4)[0] ,\"/\")\n| extend container_array = split(ProtectedContainerName,\";\")\n| extend container_arraylen = array_length(container_array)\n| extend containerNameString = iff(container_arraylen == 3, ProtectedContainerName, \"\")\n| parse containerNameString with entityType:string \";\" rgName:string \";\" entityName:string\n| extend entityURL = iff((BackupManagementType == \"AzureStorage\" and BackupItemType == \"AzureFileShare\"), iff(entityType == \"storage\", \"/Microsoft.Storage/storageAccounts/\", \"/Microsoft.ClassicStorage/storageAccounts/\"), iff((BackupManagementType == \"IaaSVM\" and BackupItemType == \"VM\"), iff(entityType =~ \"iaasvmcontainerv2\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), iff(((BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\") or (BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\")), iff(entityType =~ \"compute\", \"/Microsoft.Compute/virtualMachines/\", \"/Microsoft.ClassicCompute/virtualMachines/\"), \"\")))\n| extend DatasourceSetResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), \"\" , iff(containerNameString != \"\", strcat(prefix, \"/\", rgName, \"/providers\", entityURL, entityName), \"\")))\n//BackupSolution\n| extend DatasourceSetType = iff(BackupManagementType == \"IaaSVM\", iff(entityType =~ \"iaasvmcontainerv2\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", iff(entityType == \"storage\", \"Microsoft.Storage/storageAccounts\", \"Microsoft.ClassicStorage/storageAccounts\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", iff(entityType =~ \"compute\", \"Microsoft.Compute/virtualMachines\", \"Microsoft.ClassicCompute/virtualMachines\"), \"\")))))))\n| extend DatasourceResourceId = toupper(iff(BackupManagementType in (\"DPM\", \"AzureBackupServer\", \"MAB\"), BackupItemUniqueId, \niff(BackupManagementType == \"IaaSVM\", DatasourceSetResourceId, \niff(BackupManagementType == \"AzureStorage\", strcat(DatasourceSetResourceId, \"/fileServices/default/shares/\", BackupItemFriendlyName),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SQLDataBase;\", BackupItemName),\"\"),\niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\",iff(DatasourceSetResourceId != \"\",strcat(DatasourceSetResourceId, \"/providers/Microsoft.RecoveryServices/backupProtectedItem/SAPHanaDatabase;\", BackupItemName),\"\"),\"\"))))))\n| project-away prefix, container_array, container_arraylen, containerNameString, entityURL \n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet PolicyUnderAzureDiagnostics = ()\n{\nlet PolicyTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where OperationName == \"Policy\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"), PolicyName = columnifexists(\"PolicyName_s\", \"\"), ResourceId, BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupManagementType, PolicyName, ResourceId, TimeGenerated \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet PolicyUnderResourceSpecific = ()\n{\nlet PolicyTable = AddonAzureBackupPolicy\n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Policy\" \n| project PolicyUniqueId, PolicyName, ResourceId, TimeGenerated, BackupManagementType\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by PolicyUniqueId, ResourceId;\nPolicyTable\n};\nlet JobUnderAzureDiagnostics = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AzureDiagnostics \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"Job\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n// Exclude Log Jobs and InProgress Jobs\n| project JobOperation = columnifexists(\"JobOperation_s\", \"\") , JobOperationSubType = columnifexists(\"JobOperationSubType_s\", \"\"), JobUniqueIdGuid = columnifexists(\"JobUniqueId_g\", \"\") , JobUniqueIdStr = columnifexists(\"JobUniqueId_s\", \"\"),\nProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\",\"\"), AdHocOrScheduledJob = columnifexists(\"AdHocOrScheduledJob_s\",\"\"), RecoveryJobDestination = columnifexists(\"RecoveryJobDestination_s\",\"\"),\nRecoveryJobRPDateTime = todatetime(columnifexists(\"RecoveryJobRPDateTime_s\",\"\")), RecoveryJobRPLocation = columnifexists(\"RecoveryJobRPLocation_s\",\"\"), RecoveryLocationType = columnifexists(\"RecoveryLocationType_s\",\"\"),\nBackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\",\"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\",\"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\",\"\"),\nJobStatus = columnifexists(\"JobStatus_s\",\"\"), JobFailureCode = columnifexists(\"JobFailureCode_s\",\"\"), JobStartDateTime = todatetime(columnifexists(\"JobStartDateTime_s\",\"\")), JobDurationInSecs = todouble(columnifexists(\"JobDurationInSecs_s\", \"\")),\nDataTransferredInMB = todouble(columnifexists(\"DataTransferredInMB_s\",\"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\",\"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog) \n| extend JobUniqueId = iff(JobUniqueIdGuid == \"\", JobUniqueIdStr, JobUniqueIdGuid) \n| project-away JobUniqueIdGuid, JobUniqueIdStr\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId ;\nJobTable\n};\nlet JobUnderResourceSpecific = (IsBackupItemAssociatedJobsOnly:bool)\n{\nlet JobTable = AddonAzureBackupJobs \n// Take records until previous day\n| where TimeGenerated >= ExtRangeStart and TimeGenerated <= ExtRangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"Job\" \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (IsBackupItemAssociatedJobsOnly and BackupItemUniqueId != \"\") or ( not(IsBackupItemAssociatedJobsOnly))\n// Exclude Log Jobs and InProgress Jobs\n| where not(JobStatus == \"InProgress\")\n| where ( _ExcludeLog and not((JobOperation == \"Backup\" and JobOperationSubType == \"Log\") or (JobOperation == \"Backup\" and JobOperationSubType == \"Recovery point_Log\"))) or not(_ExcludeLog)\n| where JobStartDateTime >= _RangeStart and JobStartDateTime <= _RangeEnd\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId;\nJobTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BackupInstanceName) or _BackupInstanceName == \"*\" or BackupItemFriendlyName contains (_BackupInstanceName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderAzureDiagnostics | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet JoinWithPolicy = (T:(PolicyUniqueId:string, ResourceId:string))\n{\nT | join kind= leftouter (\n PolicyUnderResourceSpecific | project PolicyUniqueId, PolicyName, ResourceId) on PolicyUniqueId, ResourceId\n};\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Policy = ()\n{\nJoinWithPolicy(Base) \n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated, ResourceId\n};\nBase_Policy\n};\nlet LatestBackupItemWithProtectedContainerTable = () \n{\nTotalBackupItemDimensionTable\n| join (union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics()| where _ExcludeLegacyEvent == false),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId) on BackupItemUniqueId\n| where isempty(_DatasourceSetName) or _DatasourceSetName == \"*\" or ProtectedContainerFriendlyName contains (_DatasourceSetName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet JobFinalTable = (){\n union isfuzzy = true \n(JobUnderAzureDiagnostics(true)| where _ExcludeLegacyEvent == false),\n(JobUnderResourceSpecific(true))\n| project JobStatus, JobUniqueId, JobOperation, JobFailureCode, JobOperationSubType, JobStartDateTime, DataTransferredInMB, AdHocOrScheduledJob, JobDurationInSecs, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId, ProtectedContainerUniqueId, TimeGenerated \n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, JobUniqueId\n| where JobOperation in~ (_JobOperationList) or '*' in (_JobOperationList)\n| where JobStatus in~ (_JobStatusList) or '*' in (_JobStatusList)\n| where JobFailureCode in~ (_JobFailureCodeList) or '*' in (_JobFailureCodeList)\n| join kind= inner (LatestBackupItemWithProtectedContainerTable) on BackupItemUniqueId\n| project JobUniqueId, JobOperation, JobStatus, JobFailureCode, JobOperationSubType, JobStartDateTime, JobDurationInSecs, DataTransferredInMB, AdHocOrScheduledJob, RecoveryJobDestination,\nRecoveryJobRPDateTime, RecoveryJobRPLocation, RecoveryLocationType, BackupItemUniqueId = BackupItemUniqueId1, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState, StorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, PolicyName, TimeGenerated\n};\nlet FinalTable_V1Vault = () {Extend_DatasourceType(Extend_BackupInstanceId(Extend_DatasourceSetResourceId_DatasourceSetType_DatasourceResourceId(JobFinalTable)))\n| project UniqueId = JobUniqueId, OperationCategory = JobOperation, Operation = JobOperationSubType, Status = JobStatus, ErrorTitle = JobFailureCode, StartTime = JobStartDateTime, DurationInSecs = JobDurationInSecs, DataTransferredInMBs = DataTransferredInMB, RestoreJobRPDateTime = RecoveryJobRPDateTime, RestoreJobRPLocation = RecoveryJobRPLocation, BackupInstanceUniqueId = BackupItemUniqueId, BackupInstanceId, BackupInstanceFriendlyName = BackupItemFriendlyName, DatasourceResourceId, DatasourceFriendlyName = BackupItemFriendlyName, DatasourceType, BackupSolution, DatasourceSetResourceId, DatasourceSetType, DatasourceSetFriendlyName = ProtectedContainerFriendlyName, VaultResourceId = ResourceId, VaultUniqueId, VaultName, VaultTags, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForLatestData": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Latest",
+ "type": "string",
+ "value": "let _RangeStart = iff(( datetime(@{parameters('endDate')})== datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('endDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Scope": {
+ "actions": {
+ "Run_query_and_visualize_results-SummaryGrid": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "let BackupInstanceDetails = (){\n// calling LA System Function\n@{variables('BackupInstanceFunction')}\n// query to transform function output\n| summarize BackupInstances=count(UniqueId), CloudStorage=sum(VaultStore_StorageConsumptionInMBs)/(1024) by BackupSolution\n};\nlet JobSuccessPercentageTable = (){\n// calling LA System Function\n@{variables('JobFunction')}\n// query to transform function output\n| extend success=iff((Status == \"Completed\" or Status == \"CompletedWithWarnings\") , 1 , 0)\n| extend record = iff(UniqueId != \"\", 1, 0) // to be used for total row count\n| summarize SuccessfulCount =sum(success), TotalCount=sum(record) by BackupSolution\n| extend JobSuccessPercentage = (SuccessfulCount*100)/todouble(TotalCount)\n| project-away SuccessfulCount, TotalCount\n};\nBackupInstanceDetails | join kind = leftouter (JobSuccessPercentageTable) on BackupSolution | project-away BackupSolution1 | project BackupSolution, BackupInstances, JobSuccessPercentage=iff( (isnan( JobSuccessPercentage) or isinf( JobSuccessPercentage) or isempty( JobSuccessPercentage)), \"-\", strcat(tostring(round( JobSuccessPercentage,2)), \" %\")), CloudStorage",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Html Table"
+ }
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-JobFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT664 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT664
new file mode 100644
index 0000000..e662ec6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT664
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-usage-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-usage-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898812,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-usage-report/prereqs/prereq.azuredeploy.json",
+ "/demos/backup-usage-report/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT664",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT664",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE-32"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "sku": "pergb2018",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-32",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByArmTemplateTest": "true"
+ },
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "existingLogicAppWorkspace": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "existingWorkspaceResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingWorkspaceSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "existingWorkspacesToQuery": {
+ "type": "array",
+ "value": "[array(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT665 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT665
new file mode 100644
index 0000000..06fffe5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT665
@@ -0,0 +1,802 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/backup-usage-report/azuredeploy.json",
+ "/demos/backup-usage-report/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898820,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/backup-usage-report/azuredeploy.json",
+ "/demos/backup-usage-report/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT665",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/connections",
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT665",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "String",
+ "defaultValue": "Usage",
+ "metadata": {
+ "description": "Name of the Logic App to be created."
+ }
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region in which the Logic App should be created."
+ }
+ },
+ "logicAppWorkspace": {
+ "type": "String",
+ "metadata": {
+ "description": "Name of the existing Log Analytics workspace that the Logic App should connect to. Note that the Logic App connects to a single workspace, but can query data across multiple workspaces. Use the 'Workspaces To Query' parameter to specify the list of workspaces that the Logic App should query data from."
+ },
+ "value": "GET-PREREQ-existingLogicAppWorkspace"
+ },
+ "workspaceSubscriptionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceSubscriptionId"
+ },
+ "workspaceResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group name of the existing Log Analytics workspace that the Logic App should connect to."
+ },
+ "value": "GET-PREREQ-existingWorkspaceResourceGroup"
+ },
+ "workspacesToQuery": {
+ "type": "Array",
+ "metadata": {
+ "description": "List of workspaces that the Logic App should query data from. Should be a comma-separated array of values of the format ['/subscriptions/{subscriptionId1}/resourceGroups/{resourceGroupName1}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName1}','/subscriptions/{subscriptionId2}/resourceGroups/{resourceGroupName2}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName2}']"
+ },
+ "value": "GET-PREREQ-existingWorkspacesToQuery"
+ },
+ "emailFrequency": {
+ "type": "String",
+ "allowedValues": [
+ "Day",
+ "Week",
+ "Month"
+ ],
+ "defaultValue": "Day",
+ "metadata": {
+ "description": "Frequency at whch emails should be received by the recipient(s). Select 'Day' for sending emails once a day, 'Week' for sending emails once a week, or 'Month' for sending emails once a month."
+ }
+ },
+ "recipientEmailId": {
+ "type": "String",
+ "metadata": {
+ "description": "Email id of the recipient(s). To specify multiple email ids, use a semicolon-separated list."
+ },
+ "value": "vijeya@microsoft.com"
+ },
+ "startDate": {
+ "type": "String",
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "metadata": {
+ "description": "Start Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "endDate": {
+ "type": "String",
+ "defaultValue": "[utcNow('u')]",
+ "metadata": {
+ "description": "End Date and Time (in UTC) of the data to be queried by the Logic App. Use yyyy-MM-dd HH:mm:ssZ format."
+ }
+ },
+ "vaultSubscriptionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of subscriptions in which Recovery Services vaults exist. Should be of the format '{subscriptionId1},{subscriptionId2},..'. Default value is '*', which enables the Logic App to query data across all backup subscriptions that are sending data to the specified Log Analytics workspaces."
+ }
+ },
+ "vaultLocationListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of regions in which Recovery Services vaults exist. Should be of the format 'location1,location2,..' (eg. eastus,westus). Default value is '*', which enables the Logic App to query data for vaults across all Azure regions in the specified subscriptions."
+ }
+ },
+ "vaultListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Recovery Services vaults. Should be of the format 'vaultname1,vaultname2,..'. Default value is '*', which enables the Logic App to query data for all vaults in the specified subscriptions and locations."
+ }
+ },
+ "backupSolutionListFilter": {
+ "type": "String",
+ "defaultValue": "*",
+ "metadata": {
+ "description": "Use to filter data queried by the Logic App to a limited set of Azure Backup solutions being used in your environment. Should be of the format 'solution1,solution2,..' (eg. Azure VM Backup,SQL in Azure VM Backup,DPM). Default value is '*', which enables the Logic App to query data across all Azure Backup solutions being used."
+ }
+ },
+ "excludeLegacyEvent": {
+ "type": "Bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Selecting 'true' enables the Logic App to avoid querying data that is sent to the legacy Azure Diagnostics table in the Log Analytics workspace(s). Excluding the legacy table improves query performance time."
+ }
+ },
+ "aggregationType": {
+ "type": "String",
+ "allowedValues": [
+ "Daily",
+ "Weekly",
+ "Monthly"
+ ],
+ "defaultValue": "Daily",
+ "metadata": {
+ "description": "Use to specify the granularity at which data is sampled in the case of trend graphs."
+ }
+ },
+ "resourceTags": {
+ "type": "object",
+ "defaultValue": {
+ "UsedByBackupReports": "true"
+ },
+ "metadata": {
+ "description": "Tags to be assigned to the Logic App and the API connection resources."
+ }
+ },
+ "emailSubject": {
+ "type": "string",
+ "defaultValue": "Usage",
+ "metadata": {
+ "description": "Subject of the email to be received by the recipient(s)."
+ }
+ }
+ },
+ "variables": {
+ "office365ConnectionName": "[resourceGroup().location]-office365",
+ "azureMonitorLogsConnectionName": "[resourceGroup().location]-azuremonitorlogs"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-office365",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ },
+ "displayName": "office365"
+ }
+ },
+ {
+ "type": "Microsoft.Web/connections",
+ "apiVersion": "2018-07-01-preview",
+ "name": "[resourceGroup().location]-azuremonitorlogs",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "properties": {
+ "api": {
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "displayName": "azuremonitorlogs"
+ }
+ },
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "Usage",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "UsedByBackupReports": "true"
+ },
+ "dependsOn": [
+ "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs"
+ ],
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "$connections": {
+ "defaultValue": {},
+ "type": "Object"
+ },
+ "dataToExport": {
+ "defaultValue": "Usage",
+ "type": "String"
+ },
+ "aggregationType": {
+ "defaultValue": "\"Daily\"",
+ "type": "String"
+ },
+ "backupSolutionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "excludeLegacyEvent": {
+ "defaultValue": true,
+ "type": "Bool"
+ },
+ "endDate": {
+ "defaultValue": "[utcNow('u')]",
+ "type": "String"
+ },
+ "startDate": {
+ "defaultValue": "[dateTimeAdd(utcNow('u'), '-P7D')]",
+ "type": "String"
+ },
+ "vaultListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultLocationListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "vaultSubscriptionListFilter": {
+ "defaultValue": "\"*\"",
+ "type": "String"
+ },
+ "workspacesToQuery": {
+ "defaultValue": "GET-PREREQ-existingWorkspacesToQuery",
+ "type": "Array"
+ }
+ },
+ "triggers": {
+ "Recurrence": {
+ "recurrence": {
+ "frequency": "Day",
+ "interval": 1
+ },
+ "type": "Recurrence"
+ }
+ },
+ "actions": {
+ "For_each": {
+ "foreach": "@parameters('workspacesToQuery')",
+ "actions": {
+ "Append_to_string_variable": {
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AzureDiagnostics_Incomplete",
+ "value": " workspace('@{items('For_each')}').AzureDiagnostics,"
+ }
+ },
+ "Append_to_string_variable_2": {
+ "runAfter": {
+ "Append_to_string_variable": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "CoreAzureBackup_Incomplete",
+ "value": " workspace('@{items('For_each')}').CoreAzureBackup,"
+ }
+ },
+ "Append_to_string_variable_3": {
+ "runAfter": {
+ "Append_to_string_variable_2": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupJobs,"
+ }
+ },
+ "Append_to_string_variable_4": {
+ "runAfter": {
+ "Append_to_string_variable_3": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupPolicy,"
+ }
+ },
+ "Append_to_string_variable_5": {
+ "runAfter": {
+ "Append_to_string_variable_4": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupProtectedInstance,"
+ }
+ },
+ "Append_to_string_variable_6": {
+ "runAfter": {
+ "Append_to_string_variable_5": [
+ "Succeeded"
+ ]
+ },
+ "type": "AppendToStringVariable",
+ "inputs": {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "value": " workspace('@{items('For_each')}').AddonAzureBackupStorage,"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupStorage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Foreach"
+ },
+ "If_Scope_Failed": {
+ "actions": {
+ "Send_an_email_(V2)-FailureRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Body": "The Logic App Run did not execute to completion.
\n
Status: @{result('Scope')[0]['status']}
Learn more about how to troubleshoot the error
",
+ "Subject": "Usage",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ },
+ "runAfter": {
+ "Scope": [
+ "Succeeded",
+ "Failed",
+ "Skipped",
+ "TimedOut"
+ ]
+ },
+ "else": {
+ "actions": {
+ "Send_an_email_(V2)-SuccessfulRun": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": {
+ "Attachments": [
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-BillingGroupTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-BillingGroupTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{body('Run_query_and_visualize_results-CloudStorageTrend')?['attachmentContent']}",
+ "Name": "@body('Run_query_and_visualize_results-CloudStorageTrend')?['attachmentName']"
+ },
+ {
+ "ContentBytes": "@{base64(body('Create_CSV_table-BillingGroupList'))}",
+ "Name": "BillingGroupList.csv"
+ }
+ ],
+ "Body": "
\nUsage Report
\n
\nEmail Contents
\n
\n1. Inline
a. Trend of protected instance count over time
b. Trend of backup cloud storage (GB) consumed over time
2. Attachments
a. List of all billin groups with details on protected instance count, total cloud storage consumed (GB), storage replication type etc.
Learn more about Backup Reports
\n
\n@{variables('visual')}
\n
\n
\n
\n
\n
",
+ "Subject": "Usage",
+ "To": "vijeya@microsoft.com"
+ },
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['office365']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/v2/Mail"
+ }
+ }
+ }
+ },
+ "expression": {
+ "or": [
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Failed"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Aborted"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "Skipped"
+ ]
+ },
+ {
+ "equals": [
+ "@result('Scope')[0]['status']",
+ "TimedOut"
+ ]
+ }
+ ]
+ },
+ "type": "If"
+ },
+ "Initialize_variable-NoDataMessage": {
+ "inputs": {
+ "variables": [
+ {
+ "name": "NoDataMessage",
+ "type": "array",
+ "value": [
+ {
+ "Message": "No records found"
+ }
+ ]
+ }
+ ]
+ },
+ "runAfter": {
+ "Initialize_variable-EmailBodyForSuccessfulRun": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable"
+ },
+ "Initialize_variable-AddonAzureBackupJobs": {
+ "runAfter": {
+ "Initialize_variable-CoreAzureBackup": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupJobs_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupJobs = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupPolicy": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupJobs": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupPolicy_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupPolicy = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupProtectedInstance": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupPolicy": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupProtectedInstance_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupProtectedInstance = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AddonAzureBackupStorage": {
+ "runAfter": {
+ "Initialize_variable-AddonAzureBackupProtectedInstance": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AddonAzureBackupStorage_Incomplete",
+ "type": "string",
+ "value": "let AddonAzureBackupStorage = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-AzureDiagnostics": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "AzureDiagnostics_Incomplete",
+ "type": "string",
+ "value": "let AzureDiagnostics = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BillingGroupFunction": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForLatestData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BillingGroupFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Latest')}\nlet _BillingGroupName = \"*\";\n//Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\nlet AzureStorageProtectedInstanceCountCutoffDate = datetime(2/01/2021, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedInstanceUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay;\nProtectedInstanceTable\n};\n// BusinessLogic\nlet LatestBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| where BackupItemUniqueId != \"\"\n// To show as per as on 'AsonDay'\n| where startofday(TimeGenerated) == AsonDay\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or BackupItemFriendlyName contains (_BillingGroupName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or BackupItemFriendlyName contains (_BillingGroupName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_CombinationUnderAzureDiagnostics = ()\n{\nlet Base = () {ProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderAzureDiagnostics \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderAzureDiagnostics | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nBase_Size\n};\nlet BI_CombinationUnderResourceSpecific = ()\n{\nlet Base = () {ProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n| join kind= rightouter (\n BackupItemAssociationUnderResourceSpecific \n\t// To show as per as on 'AsonDay'\n\t| where startofday(TimeGenerated) == AsonDay\n\t| project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n) on ProtectedContainerUniqueId \n| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, ResourceId\n};\nlet Base_Size = ()\n{\nBase\n| join kind= leftouter (\n BackupItemFrontEndSizeUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated \n) on BackupItemUniqueId\n// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n| join kind= leftouter (\n StorageAssociationUnderResourceSpecific | where startofday(TimeGenerated) == AsonDay | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated\n) on BackupItemUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n StorageConsumedInMBs, TimeGenerated, ResourceId\n};\nBase_Size\n};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\t\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\nBase_Size\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tBase_Size\n};\nlet LatestBackupItemAssociationAndStorageConsumptionTable = ()\n{\nLatestBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_CombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(BI_CombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n)on BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nVaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, TimeRangeEndDay = startofday(TimeGenerated)\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = () \n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(BI_HistoryCombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nVaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, TimeRangeEndDay\n};\nlet LatestProtectedContainerHistoryInfoTableExcludingDPMVMs = (){\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable \n| where not((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n| summarize StorageConsumedInMBs = sum(StorageConsumedInMBs), BackupItemFrontEndSize = sum(BackupItemFrontEndSize), ProtectedContainerName = any(ProtectedContainerName), ProtectedContainerFriendlyName = any(ProtectedContainerFriendlyName), CustomBackupManagementType = iff((any(BackupManagementType) has \"AzureWorkload\"), any(strcat(BackupManagementType, \"/\", BackupItemType)), any(BackupManagementType)), BackupManagementType = any(BackupManagementType), BackupSolution = any(BackupSolution), VaultUniqueId = any(VaultUniqueId), VaultName = any(VaultName), VaultTags = any(VaultTags), SubscriptionId = any(SubscriptionId), ResourceGroupName = any(ResourceGroupName), AzureDataCenter = any(AzureDataCenter), StorageReplicationType = any(StorageReplicationType), ResourceId = any(ResourceId), TimeGenerated = any(TimeGenerated) by ProtectedContainerUniqueId, TimeRangeEndDay\n};\nlet LatestProtectedContainerInfoTableExcludingDPMVMs = (){\n// projecting TimeRangeDay to distill the report for RangeEndDay\nLatestBackupItemAssociationAndStorageConsumptionTable\n| where not((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n// CustomBackupManagementType needed to distinguish 'AzureWorkload' \n| summarize StorageConsumedInMBs = sum(StorageConsumedInMBs), BackupItemFrontEndSize = sum(BackupItemFrontEndSize), ProtectedContainerName = any(ProtectedContainerName), ProtectedContainerFriendlyName= any(ProtectedContainerFriendlyName), CustomBackupManagementType = iff((any(BackupManagementType) has \"AzureWorkload\"), any(strcat(BackupManagementType, \"/\", BackupItemType)), any(BackupManagementType)),\nBackupManagementType = any(BackupManagementType), BackupSolution = any(BackupSolution), VaultUniqueId = any(VaultUniqueId), VaultName = any(VaultName), VaultTags = any(VaultTags), SubscriptionId = any(SubscriptionId), ResourceGroupName = any(ResourceGroupName), AzureDataCenter = any(AzureDataCenter), StorageReplicationType = any(StorageReplicationType), ResourceId = any(ResourceId), TimeGenerated = any(TimeGenerated), TimeRangeEndDay = startofday(any(TimeGenerated)) by ProtectedContainerUniqueId\n};\nlet TotalProtectedInstanceHistoryTable = (isProtectedContainerBillingType:bool) \n{union isfuzzy = true \n(ProtectedInstanceHistoryUnderAzureDiagnostics(isProtectedContainerBillingType) | where _ExcludeLegacyEvent == false),\n(ProtectedInstanceHistoryUnderResourceSpecific(isProtectedContainerBillingType))\n// ProtectedInstance is at BillingGroup level. CustomBackupManagementType can be the filter used.\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay\n};\nlet LatestProtectedInstanceTable = (isProtectedContainerBillingType:bool) \n{union isfuzzy = true \n(ProtectedInstanceUnderAzureDiagnostics(isProtectedContainerBillingType) | where _ExcludeLegacyEvent == false),\n(ProtectedInstanceUnderResourceSpecific(isProtectedContainerBillingType))\n| where startofday(TimeGenerated) == AsonDay\n// ProtectedInstance is at BillingGroup level. CustomBackupManagementType can be the filter used.\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay = startofday(TimeGenerated)\n};\nlet LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId = ()\n{ \nTotalProtectedInstanceHistoryTable(true) \n| join kind= rightouter (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType = BackupManagementType1, BackupSolution, CustomBackupManagementType, BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, BillingGroupUniqueId = ProtectedContainerUniqueId1, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter,\nStorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceTableFromProtectedContainerUniqueId = ()\n{ \nLatestProtectedInstanceTable(true)\n| join kind= rightouter (LatestProtectedContainerInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType = BackupManagementType1, BackupSolution, CustomBackupManagementType, BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, BillingGroupUniqueId = ProtectedContainerUniqueId1, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter,\nStorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceHistoryTableFromBackupItemUniqueId = ()\n{ \n(TotalProtectedInstanceHistoryTable(false) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\"))\n| join kind= rightouter (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where ((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \n or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n | extend CustomBackupManagementType = BackupManagementType) on BackupItemUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, CustomBackupManagementType, BackupManagementType, BackupSolution, BillingGroupType = \"Datasource\", BillingGroupFriendlyName = BackupItemFriendlyName, BillingGroupUniqueId = BackupItemUniqueId1, BillingGroupName = BackupItemName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceTableFromBackupItemUniqueId = ()\n{ \n(LatestProtectedInstanceTable(false)\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\"))\n| join kind= rightouter \n// applicable only for DPM VM Scenarios\n(LatestBackupItemAssociationAndStorageConsumptionTable | where ((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n| extend CustomBackupManagementType = BackupManagementType) on BackupItemUniqueId\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType, CustomBackupManagementType, BackupSolution, BillingGroupType = \"Datasource\", BillingGroupFriendlyName = BackupItemFriendlyName, \n BillingGroupUniqueId = BackupItemUniqueId1, BillingGroupName = BackupItemName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\n// Special handling for DPM, AzureBackupServer Cluster scenario - Node PS has ProtectedInstance, whereas Cluster PS has storage Consumption\nlet LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId = ()\n{ \n((TotalProtectedInstanceHistoryTable(true) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where ProtectedInstanceCount > 0)\n| join kind= leftanti (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay)\n| join (\nunion isfuzzy = true \n(ProtectedContainerUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ProtectedContainerUnderResourceSpecific())\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId)\n on ProtectedContainerUniqueId\n // BackupItemFrontEndSize and StorageConsumed will be 0.0 as the same will be calculated at cluster level \n // As it is DPM or AzureBackupServer, no extra handling needed for AzureWorkload\n // Ideally the TimeGenerated field should come from BackupItem/ProtectedContainer. This is a special case and we are getting the container properties from latest table and not from history table.\n| project TimeRangeEndDay, TimeGenerated, ProtectedInstanceCount, BackupItemFrontEndSize = 0.0, StorageConsumedInMBs = 0.0, BackupManagementType, CustomBackupManagementType = BackupManagementType, \nBackupSolution = iff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \"DPM\"), BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, \n BillingGroupUniqueId = ProtectedContainerUniqueId, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\n// Special handling for DPM, AzureBackupServer Cluster scenario - Node PS has ProtectedInstance, whereas Cluster PS has storage Consumption\nlet LatestProtectedInstanceTableFromDPMNodeProtectedContainerUniqueId = ()\n{ \n(\n(LatestProtectedInstanceTable(true)\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where ProtectedInstanceCount > 0)\n| join kind= leftanti (LatestProtectedContainerInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId\n| project ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay)\n| join (\nunion isfuzzy = true \n(ProtectedContainerUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ProtectedContainerUnderResourceSpecific())\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId)\n on ProtectedContainerUniqueId\n // BackupItemFrontEndSize and StorageConsumed will be 0.0 as the same will be calculated at cluster level \n // As it is DPM or AzureBackupServer, no extra handling needed for AzureWorkload\n // Ideally the TimeGenerated field should come from BackupItem/ProtectedContainer. This is a special case and we are getting the container properties from latest table and not from history table.\n| project TimeRangeEndDay, TimeGenerated, ProtectedInstanceCount, BackupItemFrontEndSize = 0.0, StorageConsumedInMBs = 0.0, BackupManagementType, CustomBackupManagementType = BackupManagementType,\n BackupSolution = iff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \"DPM\"), BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, \n BillingGroupUniqueId = ProtectedContainerUniqueId, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet ProtectedInstanceHistoryMetric = ( )\n{ union \n(LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId()),\n(LatestProtectedInstanceHistoryTableFromBackupItemUniqueId()),\n(LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| project CustomBackupManagementType, BackupItemFrontEndSize, StorageConsumedInMBs, BillingGroupUniqueId, BillingGroupFriendlyName, BillingGroupName, ProtectedInstanceCount, BillingGroupType, TimeRangeEndDay, TimeGenerated, BackupManagementType, BackupSolution, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet ProtectedInstanceMetric = ( ) \n{ union \n(LatestProtectedInstanceTableFromBackupItemUniqueId() ),\n(LatestProtectedInstanceTableFromProtectedContainerUniqueId()),\n(LatestProtectedInstanceTableFromDPMNodeProtectedContainerUniqueId)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| project CustomBackupManagementType, BackupManagementType, BackupSolution, BackupItemFrontEndSize, StorageConsumedInMBs, ProtectedInstanceCount, BillingGroupUniqueId, BillingGroupFriendlyName, BillingGroupName, BillingGroupType, TimeRangeEndDay, TimeGenerated, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet FinalTable = () {union (ProtectedInstanceMetric | where (_RangeEnd-_RangeStart == 1d)), (ProtectedInstanceHistoryMetric | where (_RangeEnd-_RangeStart > 1d))\n};\n// Display Tweaks for AFS and null ProtectedInstanceCount\n// Billing Entity is at BackupManagementType level and not at DS level. \nlet FinalTable_V1Vault = () {FinalTable\n| project CustomBackupManagementType, BackupManagementType, BackupSolution, ProtectedInstanceCount = iff(isempty(ProtectedInstanceCount), 0.0 ,todouble(ProtectedInstanceCount)/10), StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), todouble(StorageConsumedInMBs)), BackupItemFrontEndSize = iff(isempty(BackupItemFrontEndSize), todouble(0), todouble(BackupItemFrontEndSize)), BillingGroupUniqueId, BillingGroupType, BillingGroupName, BillingGroupFriendlyName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, StorageReplicationType, ProtectedContainerName, TimeGenerated\n| project UniqueId = BillingGroupUniqueId, Name = BillingGroupName, Type = BillingGroupType, FriendlyName = BillingGroupFriendlyName, SourceSizeInMBs = BackupItemFrontEndSize, ExtendedProperties = pack(\"ProtectedInstanceCount\", ProtectedInstanceCount), VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, BackupSolution, VaultUniqueId, VaultName, VaultResourceId = ResourceId, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultTags, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-BillingGroupTrendFunction": {
+ "runAfter": {
+ "Initialize_variable-BillingGroupFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "BillingGroupTrendFunction",
+ "type": "string",
+ "value": "@{variables('workspacesToQuery_Custom')}\n@{variables('ReportFilter_Trend')}\nlet _BillingGroupName = \"*\";\n//Other Vars\nlet AsonDay = _RangeEnd-1d;\nlet AzureStorageCutoffDate = datetime(6/01/2020, 12:00:00.000 AM);\nlet AzureStorageProtectedInstanceCountCutoffDate = datetime(2/01/2021, 12:00:00.000 AM);\n// HelperFunctions\nlet Extend_BackupSolution = (T:(BackupManagementType:string, BackupItemType:string))\n{\nT | extend BackupSolution = iff(BackupManagementType == \"IaaSVM\", \"Azure Virtual Machine Backup\", \niff(BackupManagementType == \"MAB\", \"Azure Backup Agent\", \niff(BackupManagementType == \"DPM\", \"DPM\", \niff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \niff(BackupManagementType == \"AzureStorage\", \"Azure Storage (Azure Files) Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SQLDataBase\", \"SQL in Azure VM Backup\", \niff(BackupManagementType == \"AzureWorkload\" and BackupItemType == \"SAPHanaDatabase\", \"SAP HANA in Azure VM Backup\", \"\")))))))\n};\n// Source Tables\nlet VaultUnderAzureDiagnostics = ()\n{\nAzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"Vault\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\"\n| project VaultName = columnifexists(\"VaultName_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), VaultTags = columnifexists(\"VaultTags_s\", \"\"), AzureDataCenter = columnifexists(\"AzureDataCenter_s\", \"\"), ResourceGroupName = columnifexists(\"ResourceGroupName_s\", \"\"), SubscriptionId = toupper(SubscriptionId), StorageReplicationType = columnifexists(\"StorageReplicationType_s\", \"\"), ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated\n};\nlet VaultUnderResourceSpecific = ()\n{\nCoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"Vault\" \n| project StorageReplicationType, VaultUniqueId, VaultName, VaultTags, SubscriptionId = toupper(SubscriptionId), ResourceGroupName, AzureDataCenter, ResourceId, TimeGenerated \n| where SubscriptionId in~ (_VaultSubscriptionList) or '*' in (_VaultSubscriptionList)\n| where AzureDataCenter in~ (_VaultLocationList) or '*' in (_VaultLocationList)\n| where VaultName in~ (_VaultList) or '*' in (_VaultList)\n| summarize arg_max(TimeGenerated, *) by ResourceId\n};\nlet ResourceIdListUnderAzureDiagnostics = materialize(VaultUnderAzureDiagnostics | distinct ResourceId);\nlet ResourceIdListUnderResourceSpecific = materialize(VaultUnderResourceSpecific | distinct ResourceId);\nlet BackupItemUnderAzureDiagnostics = ()\n{\nlet SourceBackupItemTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItem\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupItemProtectionState = columnifexists(\"BackupItemProtectionState_s\", \"\"), BackupItemAppVersion = columnifexists(\"BackupItemAppVersion_s\", \"\"),SecondaryBackupProtectionState = columnifexists(\"SecondaryBackupProtectionState_s\", \"\"), BackupItemName = columnifexists(\"BackupItemName_s\", \"\"), BackupItemFriendlyName = columnifexists(\"BackupItemFriendlyName_s\", \"\"),\nBackupItemType = columnifexists(\"BackupItemType_s\", \"\"), ProtectionGroupName = columnifexists(\"ProtectionGroupName_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderAzureDiagnostics | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemUnderResourceSpecific = ()\n{\nlet SourceBackupItemTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"BackupItem\" and State != \"Deleted\"\n//Handle MAB system state\n// Excluding SecondaryBackupProtectionState, BackupItemAppVersion, ProtectionGroupName\n| project BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupItemName = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), \"System State\", BackupItemName), BackupItemProtectionState, BackupItemAppVersion, SecondaryBackupProtectionState, ProtectionGroupName, BackupItemFriendlyName, BackupItemType, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\");\nlet BackupItemTable = Extend_BackupSolution(SourceBackupItemTable)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nVaultUnderResourceSpecific | join (\n BackupItemTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet BackupItemAssociationUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\") , PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), \nVaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), PolicyUniqueIdGuid = columnifexists(\"PolicyUniqueId_g\", \"\"), PolicyUniqueIdStr = columnifexists(\"PolicyUniqueId_s\", \"\"),\nTimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n// PolicyUniqueId can be either guid or string due to AzureDiagnostics behaviour\n| project PolicyUniqueId = iff(PolicyUniqueIdGuid == \"\", PolicyUniqueIdStr, PolicyUniqueIdGuid), BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemAssociationHistoryUnderResourceSpecific = ()\n{\nlet BackupItemAssociationTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemAssociation\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Handle MAB SystemState\n| project PolicyUniqueId, BackupItemUniqueId = iff((BackupManagementType == \"MAB\" and BackupItemUniqueId contains \"ssbv\\\\\"), replace(@\"[^;]+$\", @\"systemstate\", BackupItemUniqueId ), BackupItemUniqueId), BackupManagementServerUniqueId, ProtectedContainerUniqueId, VaultUniqueId, BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemAssociationTable\n};\nlet BackupItemFrontEndSizeHistoryUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeHistoryUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderAzureDiagnostics = ()\n{\n let BackupItemFrontEndSizeTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"BackupItemFrontEndSizeConsumption\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemFrontEndSize = todouble(columnifexists(\"BackupItemFrontEndSize_s\", \"\")), BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet BackupItemFrontEndSizeUnderResourceSpecific = ()\n{\nlet BackupItemFrontEndSizeTable = CoreAzureBackup \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"BackupItemFrontEndSizeConsumption\" and State != \"Deleted\"\n| project BackupItemFrontEndSize, BackupItemUniqueId, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nBackupItemFrontEndSizeTable\n};\nlet StorageAssociationHistoryUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationHistoryUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now()) \n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated)) \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nStorageAssociationTable\n};\nlet StorageAssociationUnderAzureDiagnostics = ()\n{\n let StorageAssociationTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"StorageAssociation\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), VaultUniqueId = columnifexists(\"VaultUniqueId_s\", \"\"), StorageUniqueId = columnifexists(\"StorageUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"), StorageConsumedInMBs = todouble(columnifexists(\"StorageConsumedInMBs_s\", \"\")), \nStorageAllocatedInMBs = todouble(columnifexists(\"StorageAllocatedInMBs_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet StorageAssociationUnderResourceSpecific = ()\n{\nlet StorageAssociationTable = AddonAzureBackupStorage \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"StorageAssociation\" and State != \"Deleted\"\n// Not Projecting ProtectedContainerUniqueId - DPM/AzureBackupServer ProtectedContainer (incase of cluster) is node PS and not cluster PS\n| project BackupItemUniqueId, VaultUniqueId, BackupManagementServerUniqueId, StorageUniqueId, StorageConsumedInMBs, StorageAllocatedInMBs, BackupManagementType, TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n// Providers like DPM, AzureBackupServer has Disk storage. Filtering out cloud storage only.\n| where split(StorageUniqueId, \";\")[2] has \"cloud\"\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId;\nStorageAssociationTable\n};\nlet ProtectedContainerUnderAzureDiagnostics = ()\n{\nlet ProtectedContainerTable = AzureDiagnostics\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedContainer\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), ProtectedContainerFriendlyName = columnifexists(\"ProtectedContainerFriendlyName_s\", \"\"), AgentVersion = columnifexists(\"AgentVersion_s\", \"\"),\nProtectedContainerOSType = columnifexists(\"ProtectedContainerOSType_s\", \"\"), ProtectedContainerOSVersion = columnifexists(\"ProtectedContainerOSVersion_s\", \"\"), ProtectedContainerWorkloadType = columnifexists(\"ProtectedContainerWorkloadType_s\", \"\"), ProtectedContainerName = columnifexists(\"ProtectedContainerName_s\", \"\"), ProtectedContainerProtectionState = columnifexists(\"ProtectedContainerProtectionState_s\", \"\"), ProtectedContainerLocation = columnifexists(\"ProtectedContainerLocation_s\", \"\"), ProtectedContainerType = columnifexists(\"ProtectedContainerType_s\", \"\"),\nBackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderAzureDiagnostics | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedContainerUnderResourceSpecific = ()\n{\nlet ProtectedContainerTable = CoreAzureBackup\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where OperationName == \"ProtectedContainer\" and State != \"Deleted\"\n| project ProtectedContainerUniqueId, ProtectedContainerFriendlyName, AgentVersion,\nProtectedContainerOSType, ProtectedContainerOSVersion, ProtectedContainerWorkloadType, ProtectedContainerName, ProtectedContainerProtectionState, ProtectedContainerLocation, ProtectedContainerType,\nBackupManagementType, TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId;\nVaultUnderResourceSpecific | join (\n ProtectedContainerTable \n) on ResourceId\n| project-away ResourceId1, TimeGenerated1;\n};\nlet ProtectedInstanceUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId \n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId \n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId;\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderAzureDiagnostics = (isProtectedContainerBillingType:bool)\n{\n let ProtectedInstanceTable = AzureDiagnostics \n // Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderAzureDiagnostics)\n| where Category == \"AzureBackupReport\" and OperationName == \"ProtectedInstance\" and columnifexists(\"SchemaVersion_s\", \"\") == \"V2\" and columnifexists(\"State_s\", \"\") != \"Deleted\"\n| project BackupItemUniqueId = columnifexists(\"BackupItemUniqueId_s\", \"\"), ProtectedContainerUniqueId = columnifexists(\"ProtectedContainerUniqueId_s\", \"\"), BackupManagementServerUniqueId = columnifexists(\"BackupManagementServerUniqueId_s\", \"\"),\n ProtectedInstanceCount = toint(columnifexists(\"ProtectedInstanceCount_s\", \"\")), BackupManagementType = columnifexists(\"BackupManagementType_s\", \"\"), TimeGenerated, ResourceId\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\") \n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated);\nProtectedInstanceTable\n};\nlet ProtectedInstanceHistoryUnderResourceSpecific = (isProtectedContainerBillingType:bool)\n{\nlet ProtectedInstanceTable = AddonAzureBackupProtectedInstance \n// Take records until previous day\n| where TimeGenerated >= _RangeStart and TimeGenerated <= _RangeEnd and TimeGenerated < startofday(now())\n| where ResourceId in (ResourceIdListUnderResourceSpecific)\n| where OperationName == \"ProtectedInstance\" and State != \"Deleted\"\n| where not(TimeGenerated <= AzureStorageCutoffDate and BackupManagementType == \"AzureStorage\")\n| where (_AggregationType =~ \"Daily\") or (_AggregationType =~ \"Weekly\" and startofday(TimeGenerated) == startofweek(TimeGenerated)) or (_AggregationType =~ \"Monthly\" and startofday(TimeGenerated) == startofmonth(TimeGenerated))\n| where (BackupItemUniqueId == \"\" and isProtectedContainerBillingType) or (ProtectedContainerUniqueId == \"\" and not(isProtectedContainerBillingType))\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId,\n ProtectedInstanceCount = iff((BackupManagementType == \"AzureStorage\" and TimeGenerated <= AzureStorageProtectedInstanceCountCutoffDate), 0, ProtectedInstanceCount), BackupManagementType, TimeGenerated, ResourceId\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay = startofday(TimeGenerated)\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementServerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay;\nProtectedInstanceTable\n};\n// BusinessLogic\nlet TotalBackupItemDimensionTable = () {union isfuzzy = true \n(BackupItemUnderAzureDiagnostics()),\n(BackupItemUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or BackupItemFriendlyName contains (_BillingGroupName)\n| extend BackupItemProtectionState = iff(BackupItemProtectionState in (\"Protected\", \"ActivelyProtected\",\"ProtectionError\"), \"Protected\", iff(BackupItemProtectionState in (\"IRPending\"), \"InitialBackupPending\", iff(isnotempty(BackupItemProtectionState),\"ProtectionStopped\",BackupItemProtectionState)))\n//| where BackupItemProtectionState in~ (_ProtectionInfoList) or '*' in (_ProtectionInfoList)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nStorageReplicationType, ResourceId, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter};\nlet BI_HistoryCombinationUnderAzureDiagnostics = ()\n{\t\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderAzureDiagnostics | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderAzureDiagnostics | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderAzureDiagnostics | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderAzureDiagnostics | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\nBase_Size\n};\nlet BI_HistoryCombinationUnderResourceSpecific = ()\n{\n\tlet Base = ()\n\t{\n\tProtectedContainerUnderResourceSpecific | distinct ProtectedContainerName, ProtectedContainerFriendlyName, ProtectedContainerUniqueId \n\t| join kind= rightouter (\n\t\tBackupItemAssociationHistoryUnderResourceSpecific | project ProtectedContainerUniqueId, BackupItemUniqueId, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t) on ProtectedContainerUniqueId\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId = ProtectedContainerUniqueId1, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tlet Base_Size = ()\n\t{\n\tBase\n\t| join kind= leftouter (\n\t BackupItemFrontEndSizeHistoryUnderResourceSpecific | project BackupItemFrontEndSize, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay \n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t// using leftouter due to AzureStorage - storageconsumption table is not emitted. inner join will exclude AzureStorage BackupItems.\n\t| join kind= leftouter (\n\t StorageAssociationHistoryUnderResourceSpecific | project StorageConsumedInMBs, BackupItemUniqueId, TimeGenerated, TimeRangeEndDay\n\t) on BackupItemUniqueId, TimeRangeEndDay\n\t| project BackupItemUniqueId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, BackupManagementServerUniqueId, PolicyUniqueId, BackupItemFrontEndSize,\n\t StorageConsumedInMBs, TimeGenerated, TimeRangeEndDay, ResourceId\n\t};\n\tBase_Size\n};\nlet LatestBackupItemAssociationAndStorageConsumptionHistoryTable = () \n{\nTotalBackupItemDimensionTable | join \n(union isfuzzy = true \n(BI_HistoryCombinationUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(BI_HistoryCombinationUnderResourceSpecific())\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, TimeRangeEndDay)\n on BackupItemUniqueId\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| project BackupItemUniqueId, BackupItemName, BackupItemFriendlyName, BackupManagementType, BackupItemType, BackupSolution, BackupItemProtectionState,\nVaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, TimeGenerated, ResourceId, ProtectedContainerUniqueId, ProtectedContainerName, ProtectedContainerFriendlyName, PolicyUniqueId, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementServerUniqueId, StorageReplicationType, TimeRangeEndDay\n};\nlet LatestProtectedContainerHistoryInfoTableExcludingDPMVMs = (){\nLatestBackupItemAssociationAndStorageConsumptionHistoryTable \n| where not((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \nor (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n| summarize StorageConsumedInMBs = sum(StorageConsumedInMBs), BackupItemFrontEndSize = sum(BackupItemFrontEndSize), ProtectedContainerName = any(ProtectedContainerName), ProtectedContainerFriendlyName = any(ProtectedContainerFriendlyName), CustomBackupManagementType = iff((any(BackupManagementType) has \"AzureWorkload\"), any(strcat(BackupManagementType, \"/\", BackupItemType)), any(BackupManagementType)), BackupManagementType = any(BackupManagementType), BackupSolution = any(BackupSolution), VaultUniqueId = any(VaultUniqueId), VaultName = any(VaultName), VaultTags = any(VaultTags), SubscriptionId = any(SubscriptionId), ResourceGroupName = any(ResourceGroupName), AzureDataCenter = any(AzureDataCenter), StorageReplicationType = any(StorageReplicationType), ResourceId = any(ResourceId), TimeGenerated = any(TimeGenerated) by ProtectedContainerUniqueId, TimeRangeEndDay\n};\nlet TotalProtectedInstanceHistoryTable = (isProtectedContainerBillingType:bool) \n{union isfuzzy = true \n(ProtectedInstanceHistoryUnderAzureDiagnostics(isProtectedContainerBillingType) | where _ExcludeLegacyEvent == false),\n(ProtectedInstanceHistoryUnderResourceSpecific(isProtectedContainerBillingType))\n// ProtectedInstance is at BillingGroup level. CustomBackupManagementType can be the filter used.\n//| where BackupManagementType in (BackupManagementTypeParam) or '*' in (BackupManagementTypeParam)\n| summarize arg_max(TimeGenerated, *) by BackupItemUniqueId, ProtectedContainerUniqueId, TimeRangeEndDay\n| project BackupItemUniqueId, ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay\n};\nlet LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId = ()\n{ \nTotalProtectedInstanceHistoryTable(true) \n| join kind= rightouter (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, BackupManagementType = BackupManagementType1, BackupSolution, CustomBackupManagementType, BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, BillingGroupUniqueId = ProtectedContainerUniqueId1, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter,\nStorageReplicationType, ResourceId\n};\nlet LatestProtectedInstanceHistoryTableFromBackupItemUniqueId = ()\n{ \n(TotalProtectedInstanceHistoryTable(false) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\"))\n| join kind= rightouter (LatestBackupItemAssociationAndStorageConsumptionHistoryTable | where ((BackupManagementType has \"DPM\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"DPM\" and BackupItemType has \"HyperVVM\") \n or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"VMwareVM\") or (BackupManagementType has \"AzureBackupServer\" and BackupItemType has \"HyperVVM\"))\n | extend CustomBackupManagementType = BackupManagementType) on BackupItemUniqueId, TimeRangeEndDay\n| project TimeRangeEndDay = TimeRangeEndDay1, TimeGenerated = TimeGenerated1, ProtectedInstanceCount, BackupItemFrontEndSize, StorageConsumedInMBs, CustomBackupManagementType, BackupManagementType, BackupSolution, BillingGroupType = \"Datasource\", BillingGroupFriendlyName = BackupItemFriendlyName, BillingGroupUniqueId = BackupItemUniqueId1, BillingGroupName = BackupItemName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\n// Special handling for DPM, AzureBackupServer Cluster scenario - Node PS has ProtectedInstance, whereas Cluster PS has storage Consumption\nlet LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId = ()\n{ \n((TotalProtectedInstanceHistoryTable(true) \n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where ProtectedInstanceCount > 0)\n| join kind= leftanti (LatestProtectedContainerHistoryInfoTableExcludingDPMVMs ) on ProtectedContainerUniqueId, TimeRangeEndDay\n| project ProtectedContainerUniqueId, BackupManagementType, ResourceId, TimeGenerated, ProtectedInstanceCount, TimeRangeEndDay)\n| join (\nunion isfuzzy = true \n(ProtectedContainerUnderAzureDiagnostics() | where _ExcludeLegacyEvent == false),\n(ProtectedContainerUnderResourceSpecific())\n| where BackupManagementType in (\"DPM\",\"AzureBackupServer\")\n| where isempty(_BillingGroupName) or _BillingGroupName == \"*\" or ProtectedContainerFriendlyName contains (_BillingGroupName)\n| summarize arg_max(TimeGenerated, *) by ProtectedContainerUniqueId)\n on ProtectedContainerUniqueId\n // BackupItemFrontEndSize and StorageConsumed will be 0.0 as the same will be calculated at cluster level \n // As it is DPM or AzureBackupServer, no extra handling needed for AzureWorkload\n // Ideally the TimeGenerated field should come from BackupItem/ProtectedContainer. This is a special case and we are getting the container properties from latest table and not from history table.\n| project TimeRangeEndDay, TimeGenerated, ProtectedInstanceCount, BackupItemFrontEndSize = 0.0, StorageConsumedInMBs = 0.0, BackupManagementType, CustomBackupManagementType = BackupManagementType, \nBackupSolution = iff(BackupManagementType == \"AzureBackupServer\", \"Azure Backup Server\", \"DPM\"), BillingGroupType = \"DatasourceSet\", BillingGroupFriendlyName = ProtectedContainerFriendlyName, \n BillingGroupUniqueId = ProtectedContainerUniqueId, BillingGroupName = ProtectedContainerName, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet ProtectedInstanceHistoryMetric = ( )\n{ union \n(LatestProtectedInstanceHistoryTableFromProtectedContainerUniqueId()),\n(LatestProtectedInstanceHistoryTableFromBackupItemUniqueId()),\n(LatestProtectedInstanceHistoryTableFromDPMNodeProtectedContainerUniqueId)\n| where BackupSolution in~ (_BackupSolutionList) or '*' in (_BackupSolutionList)\n| project CustomBackupManagementType, BackupItemFrontEndSize, StorageConsumedInMBs, BillingGroupUniqueId, BillingGroupFriendlyName, BillingGroupName, ProtectedInstanceCount, BillingGroupType, TimeRangeEndDay, TimeGenerated, BackupManagementType, BackupSolution, ProtectedContainerName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, StorageReplicationType, ResourceId\n};\nlet FinalTable = () {ProtectedInstanceHistoryMetric\n};\n// Display Tweaks for AFS and null ProtectedInstanceCount\n// Billing Entity is at BackupManagementType level and not at DS level. \nlet FinalTable_V1Vault = () {FinalTable\n| project CustomBackupManagementType, BackupManagementType, BackupSolution, ProtectedInstanceCount = iff(isempty(ProtectedInstanceCount), 0.0 ,todouble(ProtectedInstanceCount)/10), StorageConsumedInMBs = iff(isempty(StorageConsumedInMBs), todouble(0), todouble(StorageConsumedInMBs)), BackupItemFrontEndSize = iff(isempty(BackupItemFrontEndSize), todouble(0), todouble(BackupItemFrontEndSize)), BillingGroupUniqueId, BillingGroupType, BillingGroupName, BillingGroupFriendlyName, VaultUniqueId, VaultName, VaultTags, SubscriptionId, ResourceGroupName, AzureDataCenter, ResourceId, StorageReplicationType, ProtectedContainerName, TimeGenerated\n| project UniqueId = BillingGroupUniqueId, Name = BillingGroupName, Type = BillingGroupType, FriendlyName = BillingGroupFriendlyName, SourceSizeInMBs = BackupItemFrontEndSize, ExtendedProperties = pack(\"ProtectedInstanceCount\", ProtectedInstanceCount), VaultStore_StorageConsumptionInMBs = StorageConsumedInMBs, BackupSolution, VaultUniqueId, VaultName, VaultResourceId = ResourceId, VaultSubscriptionId = SubscriptionId, VaultLocation = AzureDataCenter, VaultStore_StorageReplicationType = StorageReplicationType, VaultTags, VaultType = \"Microsoft.RecoveryServices/vaults\", TimeGenerated};\n// FinalTable_DPPVault to be added later\nFinalTable_V1Vault \n| where \"Microsoft.RecoveryServices/vaults\" in~ (_VaultTypeList) or '*' in (_VaultTypeList)"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-CoreAzureBackup": {
+ "runAfter": {
+ "Initialize_variable-AzureDiagnostics": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "CoreAzureBackup_Incomplete",
+ "type": "string",
+ "value": "let CoreAzureBackup = ()\n{\nunion"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Initialize_variable-BillingGroupTrendFunction": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "visual",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForHistoricalData": {
+ "runAfter": {
+ "Initialize_variable-UnionOfWorkspaces": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Trend",
+ "type": "string",
+ "value": "let _RangeStart = iff((datetime(@{parameters('startDate')}) == datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('startDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');\nlet _AggregationType = @{parameters('aggregationType')};"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-ReportFilterForLatestData": {
+ "runAfter": {
+ "Initialize_variable-ReportFilterForHistoricalData": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ReportFilter_Latest",
+ "type": "string",
+ "value": "let _RangeStart = iff(( datetime(@{parameters('endDate')})== datetime(null)), startofday(ago(1d)), startofday(datetime(@{parameters('endDate')})));\nlet _RangeEnd = iff((datetime(@{parameters('endDate')})== datetime(null)), startofday(now()), startofday(datetime(@{parameters('endDate')})) + 1d);\nlet _VaultSubscriptionList = split(@{parameters('vaultSubscriptionListFilter')}, ',');\nlet _VaultLocationList = split(@{parameters('vaultLocationListFilter')}, ',');\nlet _VaultList = split(@{parameters('vaultListFilter')}, ',');\nlet _VaultTypeList = \"*\";\nlet _ExcludeLegacyEvent = @{parameters('excludeLegacyEvent')};\nlet _BackupSolutionList = split(@{parameters('backupSolutionListFilter')}, ',');"
+ }
+ ]
+ }
+ },
+ "Initialize_variable-UnionOfWorkspaces": {
+ "runAfter": {
+ "For_each": [
+ "Succeeded"
+ ]
+ },
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "workspacesToQuery_Custom",
+ "type": "string",
+ "value": "@{concat(concat(substring(variables('AddonAzureBackupStorage_Incomplete'),0,sub(length(variables('AddonAzureBackupStorage_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupProtectedInstance_Incomplete'),0,sub(length(variables('AddonAzureBackupProtectedInstance_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupPolicy_Incomplete'),0,sub(length(variables('AddonAzureBackupPolicy_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AddonAzureBackupJobs_Incomplete'),0,sub(length(variables('AddonAzureBackupJobs_Incomplete')),1)),'};'),\r\nconcat(substring(variables('CoreAzureBackup_Incomplete'),0,sub(length(variables('CoreAzureBackup_Incomplete')),1)),'};'),\r\nconcat(substring(variables('AzureDiagnostics_Incomplete'),0,sub(length(variables('AzureDiagnostics_Incomplete')),1)),'};'))}"
+ }
+ ]
+ }
+ },
+ "Scope": {
+ "actions": {
+ "Create_CSV_table-BillingGroupList": {
+ "runAfter": {
+ "Run_query_and_list_results-BillingGroupList": [
+ "Succeeded"
+ ]
+ },
+ "type": "Table",
+ "inputs": {
+ "format": "CSV",
+ "from": "@if(empty(body('Run_query_and_list_results-BillingGroupList')?['value']),variables('NoDataMessage'),body('Run_query_and_list_results-BillingGroupList')?['value'])"
+ }
+ },
+ "Run_query_and_list_results-BillingGroupList": {
+ "runAfter": {
+ "Run_query_and_visualize_results-CloudStorageTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BillingGroupFunction')}\n| extend name_array = split(Name,\";\")\n| extend name_arraylen = array_length(name_array)\n| project BilledEntity=FriendlyName, BilledEntityResourceGroup=iff(name_arraylen == 3, name_array[(name_arraylen-2)], \"(none)\"), BilledEntityType=Type, BackupSolution, ProtectedInstances=todouble(parse_json(ExtendedProperties).ProtectedInstanceCount), CloudStorage=VaultStore_StorageConsumptionInMBs/1024, StorageReplicationType=VaultStore_StorageReplicationType, Vault=VaultResourceId, VaultResourceGroup=split(split(tolower(VaultResourceId), '/resourcegroups/')[1],'/')[0], Subscription=VaultSubscriptionId",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/queryData",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-BillingGroupTrend": {
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BillingGroupTrendFunction')}\n// query to transform function output\n| summarize ProtectedInstanceCount = sum(todouble(parse_json(ExtendedProperties).ProtectedInstanceCount)) by startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Run_query_and_visualize_results-CloudStorageTrend": {
+ "runAfter": {
+ "Run_query_and_visualize_results-BillingGroupTrend": [
+ "Succeeded"
+ ]
+ },
+ "type": "ApiConnection",
+ "inputs": {
+ "body": "@{variables('BillingGroupTrendFunction')}\n// query to transform function output\n| summarize StorageConsumedInGBs = sum(VaultStore_StorageConsumptionInMBs)/1024 by startofday(TimeGenerated)\n",
+ "host": {
+ "connection": {
+ "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
+ }
+ },
+ "method": "post",
+ "path": "/visualizeQuery",
+ "queries": {
+ "resourcegroups": "GET-PREREQ-existingWorkspaceResourceGroup",
+ "resourcename": "GET-PREREQ-existingLogicAppWorkspace",
+ "resourcetype": "Log Analytics Workspace",
+ "subscriptions": "GET-PREREQ-existingWorkspaceSubscriptionId",
+ "timerange": "Set in query",
+ "visType": "Time Chart"
+ }
+ }
+ },
+ "Set_variable-EmailBodyForSuccessfulRun": {
+ "runAfter": {
+ "Create_CSV_table-BillingGroupList": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "visual",
+ "value": "\n
Protected Instances Trend
\n
\n
?['attachmentName']}\")
\n
\n
Cloud Storage Trend
\n
\n
?['attachmentName']}\")
\n
\n
"
+ }
+ }
+ },
+ "runAfter": {
+ "Initialize_variable-NoDataMessage": [
+ "Succeeded"
+ ]
+ },
+ "type": "Scope"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {
+ "$connections": {
+ "value": {
+ "azuremonitorlogs": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-azuremonitorlogs",
+ "connectionName": "[resourceGroup().location]-azuremonitorlogs",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azuremonitorlogs')]"
+ },
+ "office365": {
+ "connectionId": "Microsoft.Web/connections/[resourceGroup().location]-office365",
+ "connectionName": "[resourceGroup().location]-office365",
+ "id": "[subscriptionResourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'office365')]"
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT666 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT666
new file mode 100644
index 0000000..1ac67df
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT666
@@ -0,0 +1,361 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/bootstorm-vm-boot-time/azuredeploy.json",
+ "/demos/bootstorm-vm-boot-time/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898831,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/bootstorm-vm-boot-time/azuredeploy.json",
+ "/demos/bootstorm-vm-boot-time/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT666",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT666",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.16.05.27",
+ "parameters": {
+ "azureAccountUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure account SPN user name to authenticate inside controller VM."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "azureAccountPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Azure account SPN password to authenticate inside controller VM."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "tenantId": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure Subscription Tenant Id."
+ },
+ "value": ""
+ },
+ "vmCount": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "Number of VMs to create."
+ },
+ "value": 2
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "addressPrefix": "10.0.0.0/16",
+ "location": "[resourceGroup().location]",
+ "subnetName": "[concat('vsn', uniqueString(resourceGroup().id))]",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressType": "Dynamic",
+ "publicIPAddressName": "[concat('ip', uniqueString(resourceGroup().id))]",
+ "uniqueDnsNameForPublicIP": "[concat('dns', uniqueString(resourceGroup().id))]",
+ "uniqueStorageAccountName": "[concat('sa', uniqueString(resourceGroup().id))]",
+ "uniqueStorageAccountContainerName": "[concat('sc', uniqueString(resourceGroup().id))]",
+ "adResourceID": "null",
+ "vmOsSku": "2012-R2-Datacenter",
+ "vmAdminUsername": "vmadministrator",
+ "vmAdminPassword": "pwd0a!8b7",
+ "vmName": "[concat('vm', uniqueString(resourceGroup().id))]",
+ "vmOsDiskName": "[concat('od', uniqueString(resourceGroup().id))]",
+ "vmSize": "Standard_A2",
+ "vmNicName": "[concat('nc', uniqueString(resourceGroup().id))]",
+ "virtualNetworkName": "[concat('vn', uniqueString(resourceGroup().id))]",
+ "subnetRef": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]",
+ "nsgName": "[concat('ng', uniqueString(resourceGroup().id))]",
+ "nsgID": "[resourceId('Microsoft.Network/networkSecurityGroups',variables('nsgName'))]",
+ "modulesPath": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/bootstorm-vm-boot-time/",
+ "moduleVMBootAll": "VMBootAll.zip",
+ "modulesUrlVMBootAll": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/bootstorm-vm-boot-time/VMBootAll.zip",
+ "configurationFunctionVMBootAll": "VMBootAll.ps1\\ConfigureVMBootAll"
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[tolower(variables('uniqueStorageAccountName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "accountType": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[variables('publicIPAddressName')]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[variables('uniqueDnsNameForPublicIP')]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('nsgName')]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "nsgsrule",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "[variables('virtualNetworkName')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[concat('Microsoft.Network/networkSecurityGroups/', variables('nsgName'))]"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "[variables('subnetName')]",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "[variables('nsgID')]"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[variables('vmNicName')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[concat('Microsoft.Network/publicIPAddresses/',variables('publicIPAddressName'))]",
+ "[concat('Microsoft.Network/virtualNetworks/',variables('virtualNetworkName'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfigpublic",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
+ },
+ "subnet": {
+ "id": "[variables('subnetRef')]"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[concat(variables('vmNicName'),copyIndex())]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "[concat('Microsoft.Network/virtualNetworks/',variables('virtualNetworkName'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfigprivate",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "[variables('subnetRef')]"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "[variables('vmName')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[concat('Microsoft.Storage/storageAccounts/',variables('uniqueStorageAccountName'))]",
+ "[concat('Microsoft.Network/networkInterfaces/',variables('vmNicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "[variables('vmName')]",
+ "adminUsername": "vmadministrator",
+ "adminPassword": "pwd0a!8b7"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[concat(variables('vmName'),'_OSDisk')]",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('vmNicName')))]"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(concat('Microsoft.Storage/storageAccounts/', variables('uniqueStorageAccountName')),'2015-06-15').primaryEndpoints.blob]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "[concat(variables('vmName'),copyIndex())]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "[concat('Microsoft.Storage/storageAccounts/',variables('uniqueStorageAccountName'))]",
+ "[concat('Microsoft.Network/networkInterfaces/',variables('vmNicName'),copyIndex())]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "[variables('vmName')]",
+ "adminUsername": "vmadministrator",
+ "adminPassword": "pwd0a!8b7"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[concat(variables('vmName'),copyIndex(),'_OSDisk')]",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('vmNicName'),copyIndex()))]"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(concat('Microsoft.Storage/storageAccounts/', variables('uniqueStorageAccountName')),'2015-06-15').primaryEndpoints.blob]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmName'),'/dscExtension')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[concat('Microsoft.Compute/virtualMachines/',variables('vmName'))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.15",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/bootstorm-vm-boot-time/VMBootAll.zip",
+ "configurationFunction": "VMBootAll.ps1\\ConfigureVMBootAll",
+ "properties": {
+ "azureAccountUsername": "GEN-UNIQUE",
+ "azureAccountPassword": "GEN-PASSWORD",
+ "AdResourceID": "null",
+ "TenantId": "",
+ "VMName": "[variables('vmName')]",
+ "VMCount": 2,
+ "VMAdminUserName": "vmadministrator",
+ "VMAdminPassword": "pwd0a!8b7",
+ "AzureStorageAccount": "[variables('uniqueStorageAccountName')]",
+ "AzureStorageAccessKey": "[listKeys(concat('Microsoft.Storage/storageAccounts/', variables('uniqueStorageAccountName')), '2015-06-15').key1]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT667 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT667
new file mode 100644
index 0000000..0a40c12
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT667
@@ -0,0 +1,587 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/centos-2nics-lb-cluster/azuredeploy.json",
+ "/demos/centos-2nics-lb-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898839,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/centos-2nics-lb-cluster/azuredeploy.json",
+ "/demos/centos-2nics-lb-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT667",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT667",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username for VM"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique storage account name. Must be between 3 and 24 characters in length and use numbers and lower-case letters only."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "numberOfInstances": {
+ "type": "int",
+ "defaultValue": 2,
+ "allowedValues": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10
+ ],
+ "metadata": {
+ "description": "Number of VMs to deploy (2-10)"
+ },
+ "value": 2
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "allowedValues": [
+ "Standard_A3",
+ "Standard_A6",
+ "Standard_A7",
+ "Standard_A8",
+ "Standard_A9",
+ "Standard_A10",
+ "Standard_A11",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D4_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D16_v3"
+ ],
+ "metadata": {
+ "description": "Size of the Virtual Machine."
+ }
+ },
+ "dnsNameforLBIP": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS name for Load Balancer IP"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/centos-2nics-lb-cluster/",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "vmsize": {
+ "value": "Standard_D2_v3"
+ }
+ },
+ "variables": {
+ "imagePublisher": "OpenLogic",
+ "imageOffer": "CentOS",
+ "imageSKU": "7.1",
+ "customScriptFilePath": "[uri(parameters('_artifactsLocation'), concat('deploy.sh', parameters('_artifactsLocationSasToken')))]",
+ "customScriptCommandToExecute": "bash deploy.sh",
+ "publicIPAddressName": "myPublicIP",
+ "virtualNetworkName": "myVNET",
+ "availabilitySetName": "myAvSet",
+ "vnetID": "Microsoft.Network/virtualNetworks/myVNET",
+ "addressPrefix": "10.0.0.0/16",
+ "subnet1Name": "Subnet-1",
+ "subnet1Prefix": "10.0.0.0/24",
+ "subnet1Ref": "Microsoft.Network/virtualNetworks/myVNET/subnets/Subnet-1",
+ "subnet2Name": "Subnet-2",
+ "subnet2Prefix": "10.0.1.0/24",
+ "subnet2Ref": "Microsoft.Network/virtualNetworks/myVNET/subnets/Subnet-2",
+ "vmStorageAccountContainerName": "vhds",
+ "lbName": "myLB",
+ "lbID": "Microsoft.Network/loadBalancers/myLB",
+ "frontEndIPConfigID": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd",
+ "lbPoolID": "Microsoft.Network/loadBalancers/myLB/backendAddressPools/BackendPool1",
+ "lbProbeID": "Microsoft.Network/loadBalancers/myLB/probes/tcpProbe",
+ "publicIPAddressID": "Microsoft.Network/publicIPAddresses/myPublicIP",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2015-05-01-preview",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "accountType": "Standard_LRS"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myAvSet",
+ "apiVersion": "2017-12-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "myVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ },
+ {
+ "name": "Subnet-2",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nic1copyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/myVNET",
+ "Microsoft.Network/loadBalancers/myLB"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/myVNET/subnets/Subnet-1"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/myLB/backendAddressPools/BackendPool1"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/myLB/inboundNatRules/sshcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nic2copyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/myVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig2",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/myVNET/subnets/Subnet-2"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "name": "myLB",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/myPublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "BackendPool1"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "ssh0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50000,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50001,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh2",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50002,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh3",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50003,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh4",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50004,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh5",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50005,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh6",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50006,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh7",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50007,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh8",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50008,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh9",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50009,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "ssh10",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50010,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "LBRule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontEnd"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/myLB/backendAddressPools/BackendPool1"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 10,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/myLB/probes/tcpProbe"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "tcpProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": "5",
+ "numberOfProbes": "2"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "myvmcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/nic1copyIndex()",
+ "Microsoft.Network/networkInterfaces/nic2copyIndex()",
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE",
+ "Microsoft.Compute/availabilitySets/myAvSet"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "vmcopyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.1",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "myvmcopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "properties": {
+ "primary": true
+ },
+ "id": "Microsoft.Network/networkInterfaces/nic1copyindex()"
+ },
+ {
+ "properties": {
+ "primary": false
+ },
+ "id": "Microsoft.Network/networkInterfaces/nic2copyindex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "myvmcopyIndex()/extension",
+ "apiVersion": "2015-05-01-preview",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/myvmcopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('deploy.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "bash deploy.sh copyIndex() 2"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT668 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT668
new file mode 100644
index 0000000..75a9589
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT668
@@ -0,0 +1,105 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/cloud-shell-vnet/prereqs/prereq.azuredeploy.json",
+ "/demos/cloud-shell-vnet/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898849,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/cloud-shell-vnet/prereqs/prereq.azuredeploy.json",
+ "/demos/cloud-shell-vnet/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT668",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT668",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the VNET to inject Cloud Shell into"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "vnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add"
+ },
+ "value": "10.0.0.0/16"
+ },
+ "defaultSubnetName": {
+ "type": "string",
+ "defaultValue": "default",
+ "metadata": {
+ "description": "Name of the subnet to use for cloud shell containers"
+ }
+ },
+ "defaultSubnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add"
+ },
+ "value": "10.0.0.0/26"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "resources": [
+ {
+ "name": "GEN-VNET-NAME",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-04-01",
+ "tags": {
+ "displayName": "The VNET"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "default",
+ "properties": {
+ "addressPrefix": "10.0.0.0/26"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "vnetName": {
+ "type": "string",
+ "value": "[parameters('vnetName')]"
+ },
+ "defaultSubnetAddressPrefix": {
+ "type": "string",
+ "value": "[parameters('defaultSubnetAddressPrefix')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT669 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT669
new file mode 100644
index 0000000..e20bd7b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT669
@@ -0,0 +1,336 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/cloud-shell-vnet/azuredeploy.json",
+ "/demos/cloud-shell-vnet/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898863,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/cloud-shell-vnet/azuredeploy.json",
+ "/demos/cloud-shell-vnet/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT669",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/privatednszones",
+ "microsoft.authorization/roleassignments",
+ "microsoft.network/privatednszones/virtualnetworklinks",
+ "microsoft.relay/namespaces",
+ "microsoft.network/privatednszones/a",
+ "microsoft.network/privateendpoints",
+ "microsoft.network/networkprofiles",
+ "microsoft.network/virtualnetworks/subnets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT669",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1.14562",
+ "templateHash": "11655401541265786166"
+ }
+ },
+ "parameters": {
+ "existingVNETName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the existing VNET to inject Cloud Shell into."
+ },
+ "value": "GET-PREREQ-vnetName"
+ },
+ "relayNamespaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Azure Relay Namespace."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "azureContainerInstanceOID": {
+ "type": "string",
+ "metadata": {
+ "description": "Object Id of Azure Container Instance Service Principal. We have to grant this permission to create hybrid connections in the Azure Relay you specify. To get it: Get-AzADServicePrincipal -DisplayNameBeginsWith 'Azure Container Instance'"
+ },
+ "value": "GEN-AZUREAD-OBJECTID"
+ },
+ "containerSubnetName": {
+ "type": "string",
+ "defaultValue": "cloudshellsubnet",
+ "metadata": {
+ "description": "Name of the subnet to use for cloud shell containers."
+ }
+ },
+ "containerSubnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add for cloud shell. e.g. 10.0.1.0/26"
+ },
+ "value": "10.0.1.0/26"
+ },
+ "relaySubnetName": {
+ "type": "string",
+ "defaultValue": "relaysubnet",
+ "metadata": {
+ "description": "Name of the subnet to use for private link of relay namespace."
+ }
+ },
+ "relaySubnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add for relay. e.g. 10.0.2.0/26"
+ },
+ "value": "10.0.2.0/26"
+ },
+ "storageSubnetName": {
+ "type": "string",
+ "defaultValue": "storagesubnet",
+ "metadata": {
+ "description": "Name of the subnet to use for storage account."
+ }
+ },
+ "storageSubnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add for storage. e.g. 10.0.3.0/26"
+ },
+ "value": "10.0.3.0/26"
+ },
+ "privateEndpointName": {
+ "type": "string",
+ "defaultValue": "cloudshellRelayEndpoint",
+ "metadata": {
+ "description": "Name of Private Endpoint for Azure Relay."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "networkProfileName": "[format('aci-networkProfile-{0}', parameters('location'))]",
+ "contributorRoleDefinitionId": "Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
+ "networkRoleDefinitionId": "Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7",
+ "privateDnsZoneName": "[if(equals(toLower(environment().name), 'azureusgovernment'), 'privatelink.servicebus.usgovcloudapi.net', 'privatelink.servicebus.windows.net')]",
+ "vnetResourceId": "Microsoft.Network/virtualNetworks/GET-PREREQ-vnetName"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "apiVersion": "2020-04-01",
+ "name": "[format('{0}/{1}', parameters('existingVNETName'), parameters('containerSubnetName'))]",
+ "properties": {
+ "addressPrefix": "10.0.1.0/26",
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage",
+ "locations": [
+ "[resourceGroup().location]"
+ ]
+ }
+ ],
+ "delegations": [
+ {
+ "name": "CloudShellDelegation",
+ "properties": {
+ "serviceName": "Microsoft.ContainerInstance/containerGroups"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkProfiles",
+ "apiVersion": "2019-11-01",
+ "name": "[format('aci-networkProfile-{0}', parameters('location'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "containerNetworkInterfaceConfigurations": [
+ {
+ "name": "[format('eth-{0}', parameters('containerSubnetName'))]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "[format('ipconfig-{0}', parameters('containerSubnetName'))]",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/cloudshellsubnet"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/cloudshellsubnet"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "scope": "[format('Microsoft.Network/networkProfiles/{0}', variables('networkProfileName'))]",
+ "name": "[guid(variables('networkRoleDefinitionId'), parameters('azureContainerInstanceOID'), variables('networkProfileName'))]",
+ "properties": {
+ "roleDefinitionId": "Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7",
+ "principalId": "GEN-AZUREAD-OBJECTID"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkProfiles/[format('aci-networkProfile-{0}', parameters('location'))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Relay/namespaces",
+ "apiVersion": "2018-01-01-preview",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard",
+ "tier": "Standard"
+ }
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "scope": "[format('Microsoft.Relay/namespaces/{0}', parameters('relayNamespaceName'))]",
+ "name": "[guid(variables('contributorRoleDefinitionId'), parameters('azureContainerInstanceOID'), parameters('relayNamespaceName'))]",
+ "properties": {
+ "roleDefinitionId": "Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
+ "principalId": "GEN-AZUREAD-OBJECTID"
+ },
+ "dependsOn": [
+ "Microsoft.Relay/namespaces/GEN-UNIQUE-8"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "apiVersion": "2020-04-01",
+ "name": "[format('{0}/{1}', parameters('existingVNETName'), parameters('relaySubnetName'))]",
+ "properties": {
+ "addressPrefix": "10.0.2.0/26",
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/cloudshellsubnet"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-04-01",
+ "name": "cloudshellRelayEndpoint",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "cloudshellRelayEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.Relay/namespaces/GEN-UNIQUE-8",
+ "groupIds": [
+ "namespace"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/relaysubnet"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Relay/namespaces/GEN-UNIQUE-8",
+ "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/relaysubnet"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "apiVersion": "2020-04-01",
+ "name": "[format('{0}/{1}', parameters('existingVNETName'), parameters('storageSubnetName'))]",
+ "properties": {
+ "addressPrefix": "10.0.3.0/26",
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage",
+ "locations": [
+ "[resourceGroup().location]"
+ ]
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/relaysubnet"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-01-01",
+ "name": "[if(equals(toLower(environment().name), 'azureusgovernment'), 'privatelink.servicebus.usgovcloudapi.net', 'privatelink.servicebus.windows.net')]",
+ "location": "global"
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "apiVersion": "2020-01-01",
+ "name": "[format('{0}/{1}', variables('privateDnsZoneName'), parameters('relayNamespaceName'))]",
+ "properties": {
+ "ttl": 3600,
+ "aRecords": [
+ {
+ "ipv4Address": "[first(first(reference(resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))).customDnsConfigs).ipAddresses)]"
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/[if(equals(toLower(environment().name), 'azureusgovernment'), 'privatelink.servicebus.usgovcloudapi.net', 'privatelink.servicebus.windows.net')]",
+ "Microsoft.Network/privateEndpoints/cloudshellRelayEndpoint"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-01-01",
+ "name": "[format('{0}/{1}', variables('privateDnsZoneName'), parameters('relayNamespaceName'))]",
+ "location": "global",
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/GET-PREREQ-vnetName"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/[if(equals(toLower(environment().name), 'azureusgovernment'), 'privatelink.servicebus.usgovcloudapi.net', 'privatelink.servicebus.windows.net')]"
+ ]
+ }
+ ],
+ "outputs": {
+ "vnetId": {
+ "type": "string",
+ "value": "[variables('vnetResourceId')]"
+ },
+ "containerSubnetId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('existingVNETName'), parameters('containerSubnetName'))]"
+ },
+ "storageSubnetId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('existingVNETName'), parameters('storageSubnetName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT67 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT67
new file mode 100644
index 0000000..debd087
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT67
@@ -0,0 +1,505 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-dsagents.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884649,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-dsagents.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT67",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT67",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "network-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "compute-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publicIPDomainNameLabelDSAgentWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "adminUsernameDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "adminPasswordOrPublicKeyDSAgent": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "publicIPDomainNameLabelDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "linuxvmcount": {
+ "type": "int",
+ "defaultValue": ""
+ },
+ "windowsvmcount": {
+ "type": "int",
+ "defaultValue": ""
+ },
+ "ManagerAddress": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet4Ref": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmNameDSAWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmSizeDSAWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmNameDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmSizeDSAgent": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imagePublisherWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imageOfferWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imagePublisherLinux": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imageOfferLinux": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmStorageAccountContainerName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ActivationPort": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "TenantIdentifier": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "TenantActivationPassword": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "adminUsernameDSAgentWindows": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "adminPasswordDSAgentWindows": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "tagvalues": {
+ "type": "object",
+ "defaultValue": ""
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {
+ "publicIPAddressNameDSAWindows": "publicipdsawindows",
+ "networkInterfaceNameDSAWindows": "parameters('vmNameDSAWindows')-nic",
+ "publicIPAddressNameDSAgent": "publicipdsalinux",
+ "networkInterfaceNameDSAgent": "parameters('vmNameDSAgent')-nic",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/ parameters('adminUsernameDSAgent')/.ssh/authorized_keys",
+ "keyData": ""
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicipdsawindowscopyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "parameters('publicIPDomainNameLabelDSAgentWindows')copyindex()"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "parameters('vmNameDSAWindows')-niccopyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/publicipdsawindowscopyindex()"
+ ],
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicipdsawindowscopyindex()"
+ },
+ "subnet": {
+ "id": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "parameters('vmNameDSAWindows')copyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/parameters('vmNameDSAWindows')-niccopyindex()"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": ""
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "adminPassword": ""
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "",
+ "offer": "",
+ "sku": "",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "parameters('vmNameDSAWindows')copyindex()-osDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/parameters('vmNameDSAWindows')-niccopyindex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('vmNameDSAWindows')copyindex()/Installation",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('vmNameDSAWindows')copyindex()"
+ ],
+ "properties": {
+ "publisher": "TrendMicro.DeepSecurity",
+ "type": "TrendMicroDSA",
+ "typeHandlerVersion": "9.6",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "DSMname": "",
+ "DSMport": "",
+ "policyNameorID": ""
+ },
+ "protectedSettings": {
+ "tenantID": "",
+ "tenantPassword": ""
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicipdsalinuxcopyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "parameters('publicIPDomainNameLabelDSAgent')copyindex()"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "parameters('vmNameDSAgent')-niccopyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/publicipdsalinuxcopyindex()"
+ ],
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicipdsalinuxcopyindex()"
+ },
+ "subnet": {
+ "id": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "parameters('vmNameDSAgent')copyindex()",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/parameters('vmNameDSAgent')-niccopyindex()"
+ ],
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": ""
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "adminPassword": "",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "",
+ "offer": "",
+ "sku": "",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "parameters('vmNameDSAgent')copyindex()-osDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/parameters('vmNameDSAgent')-niccopyindex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('vmNameDSAgent')copyindex()/Installation",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('vmNameDSAgent')copyindex()"
+ ],
+ "copy": {
+ "name": "foo",
+ "count": ""
+ },
+ "properties": {
+ "publisher": "TrendMicro.DeepSecurity",
+ "type": "TrendMicroDSALinux",
+ "typeHandlerVersion": "9.6",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "DSMname": "",
+ "DSMport": "",
+ "policyNameorID": ""
+ },
+ "protectedSettings": {
+ "tenantID": "",
+ "tenantPassword": ""
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT670 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT670
new file mode 100644
index 0000000..03e728d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT670
@@ -0,0 +1,173 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/cloud-shell-vnet-storage/prereqs/prereq.azuredeploy.json",
+ "/demos/cloud-shell-vnet-storage/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898872,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/cloud-shell-vnet-storage/prereqs/prereq.azuredeploy.json",
+ "/demos/cloud-shell-vnet-storage/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT670",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT670",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the VNET to inject Cloud Shell into"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "vnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add"
+ },
+ "value": "10.0.0.0/16"
+ },
+ "defaultSubnetName": {
+ "type": "string",
+ "defaultValue": "default",
+ "metadata": {
+ "description": "Name of the subnet to use for cloud shell containers"
+ }
+ },
+ "defaultSubnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add"
+ },
+ "value": "10.0.0.0/26"
+ },
+ "containerSubnetName": {
+ "type": "string",
+ "defaultValue": "cloudshellsubnet",
+ "metadata": {
+ "description": "Name of the subnet to use for cloud shell containers"
+ }
+ },
+ "containerSubnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add"
+ },
+ "value": "10.0.1.0/26"
+ },
+ "storageSubnetName": {
+ "type": "string",
+ "defaultValue": "storagesubnet",
+ "metadata": {
+ "description": "Name of the subnet to use for storage account"
+ }
+ },
+ "storageSubnetAddressPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Address space of the subnet to add for storage subnet"
+ },
+ "value": "10.0.3.0/26"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "resources": [
+ {
+ "name": "GEN-VNET-NAME",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-04-01",
+ "tags": {
+ "displayName": "The VNET"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "default",
+ "properties": {
+ "addressPrefix": "10.0.0.0/26"
+ }
+ },
+ {
+ "name": "cloudshellsubnet",
+ "properties": {
+ "addressPrefix": "10.0.1.0/26",
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage",
+ "locations": [
+ "[resourceGroup().location]"
+ ]
+ }
+ ],
+ "delegations": [
+ {
+ "name": "CloudShellDelegation",
+ "properties": {
+ "serviceName": "Microsoft.ContainerInstance/containerGroups"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "storagesubnet",
+ "properties": {
+ "addressPrefix": "10.0.3.0/26",
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage",
+ "locations": [
+ "[resourceGroup().location]"
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "vnetName": {
+ "type": "string",
+ "value": "[parameters('vnetName')]"
+ },
+ "containerSubnetName": {
+ "type": "string",
+ "value": "[parameters('containerSubnetName')]"
+ },
+ "storageSubnetName": {
+ "type": "string",
+ "value": "[parameters('storageSubnetName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT671 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT671
new file mode 100644
index 0000000..15027bf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT671
@@ -0,0 +1,171 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/cloud-shell-vnet-storage/azuredeploy.json",
+ "/demos/cloud-shell-vnet-storage/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898879,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/cloud-shell-vnet-storage/azuredeploy.json",
+ "/demos/cloud-shell-vnet-storage/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT671",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts/fileservices/shares",
+ "microsoft.storage/storageaccounts",
+ "microsoft.storage/storageaccounts/fileservices",
+ "microsoft.storage/storageaccounts/blobservices"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT671",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "existingVNETName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the virtual network to use for cloud shell containers."
+ },
+ "value": "GET-PREREQ-vnetName"
+ },
+ "existingStorageSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the subnet to use for storage account."
+ },
+ "value": "GET-PREREQ-storageSubnetName"
+ },
+ "existingContainerSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the subnet to use for cloud shell containers."
+ },
+ "value": "GET-PREREQ-containerSubnetName"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the storage account in subnet."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "fileShareName": {
+ "type": "string",
+ "defaultValue": "acsshare",
+ "metadata": {
+ "description": "Name of the fileshare in storage account."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "containerSubnetRef": "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/GET-PREREQ-containerSubnetName",
+ "storageSubnetRef": "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/GET-PREREQ-storageSubnetName"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2019-06-01",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS",
+ "tier": "Standard"
+ },
+ "kind": "StorageV2",
+ "properties": {
+ "networkAcls": {
+ "bypass": "None",
+ "virtualNetworkRules": [
+ {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/GET-PREREQ-containerSubnetName",
+ "action": "Allow"
+ },
+ {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-vnetName/GET-PREREQ-storageSubnetName",
+ "action": "Allow"
+ }
+ ],
+ "defaultAction": "Deny"
+ },
+ "supportsHttpsTrafficOnly": true,
+ "encryption": {
+ "services": {
+ "file": {
+ "keyType": "Account",
+ "enabled": true
+ },
+ "blob": {
+ "keyType": "Account",
+ "enabled": true
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ },
+ "accessTier": "Cool"
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts/blobServices",
+ "apiVersion": "2019-06-01",
+ "name": "GEN-UNIQUE-8/default",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE-8"
+ ],
+ "sku": {
+ "name": "Standard_LRS",
+ "tier": "Standard"
+ },
+ "properties": {
+ "deleteRetentionPolicy": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts/fileServices",
+ "apiVersion": "2019-06-01",
+ "name": "GEN-UNIQUE-8/default",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE-8"
+ ],
+ "sku": {
+ "name": "Standard_LRS",
+ "tier": "Standard"
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
+ "apiVersion": "2019-06-01",
+ "name": "GEN-UNIQUE-8/default/acsshare",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/fileServices/GEN-UNIQUE-8/default",
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "shareQuota": 6
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT672 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT672
new file mode 100644
index 0000000..6a7e91d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT672
@@ -0,0 +1,265 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/azuredeploy.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898888,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/azuredeploy.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT672",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT672",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "clusterName": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 15,
+ "metadata": {
+ "description": "The HPC Pack cluster name. It must be unique in the location because it is also used as the public DNS name prefix for the cluster. For example, the public DNS name is '<clustername>.westus.cloudapp.azure.com' if the resource group location is 'West US'. It must contain between 3 and 15 characters with lowercase letters and numbers, and must start with a letter."
+ },
+ "value": "GEN-UNIQUE-12"
+ },
+ "privateDomainName": {
+ "type": "string",
+ "defaultValue": "hpc.local",
+ "metadata": {
+ "description": "The fully qualified domain name (FQDN) for the private domain forest which will be created by this template, for example 'hpc.local'."
+ },
+ "value": "hpc.local"
+ },
+ "headNodeVMSize": {
+ "type": "string",
+ "defaultValue": "Standard_D8s_v3",
+ "metadata": {
+ "description": "The VM size of the head node. Note that some VM sizes in the list are only available in some particular locations. Please check the availability and the price of the VM sizes at https://azure.microsoft.com/en-us/pricing/details/virtual-machines before deployment."
+ },
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "type": "string",
+ "defaultValue": "ComputeNode",
+ "allowedValues": [
+ "ComputeNode",
+ "ComputeNodeWithExcel"
+ ],
+ "metadata": {
+ "description": "The VM image of the compute nodes"
+ },
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "type": "string",
+ "defaultValue": "IaaSCN-",
+ "minLength": 1,
+ "maxLength": 12,
+ "metadata": {
+ "description": "The name prefix of the compute nodes. It must be no more than 12 characters, begin with a letter, and contain only letters, numbers and hyphens. For example, if 'IaaSCN-' is specified, the compute node names will be 'IaaSCN-000', 'IaaSCN-001', ..."
+ },
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "type": "int",
+ "defaultValue": 2,
+ "minValue": 1,
+ "maxValue": 500,
+ "metadata": {
+ "description": "The number of the compute nodes"
+ },
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4s_v3",
+ "metadata": {
+ "description": "The VM size of the compute nodes. Note that some VM sizes in the list are only available in some particular locations. Please check the availability and the price of the VM sizes at https://azure.microsoft.com/en-us/pricing/details/virtual-machines before deployment."
+ },
+ "value": "Standard_D4_v3"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Administrator user name for the virtual machines and the Active Directory domain."
+ },
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Administrator password for the virtual machines and the Active Directory domain"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "headNodePostConfigScript": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Optional URL of a public available PowerShell script you want to run on the head node after it is configured. The script will be run as the Local System account. You can also specify arguments for the script, for example 'http://www.contoso.com/myhnpostscript.ps1 -Arg1 arg1 -Arg2 arg2'."
+ }
+ },
+ "computeNodePostConfigScript": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Optional URL of a public available PowerShell script you want to run on the compute nodes after they are configured. The script will be run as the Local System account. You can also specify arguments for the script, for example 'http://www.contoso.com/mycnpostscript.ps1 -Arg1 arg1 -Arg2 arg2'."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "virtualNetworkName": "GEN-UNIQUE-12VNet",
+ "publicIPAddressName": "GEN-UNIQUE-12-PublicIP-HN",
+ "computeNodeImageOsPlatform": "Windows",
+ "computeNodeImages": {
+ "ComputeNode": {
+ "publisher": "MicrosoftWindowsServerHPCPack",
+ "offer": "WindowsServerHPCPack",
+ "sku": "2012R2CN",
+ "version": "latest"
+ },
+ "ComputeNodeWithExcel": {
+ "publisher": "MicrosoftWindowsServerHPCPack",
+ "offer": "WindowsServerHPCPack",
+ "sku": "2012R2CNExcel",
+ "version": "latest"
+ }
+ },
+ "currentComputeNodeImage": "(computeNodeImages)[parameters(computeNodeImage)]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Resources/deployments",
+ "name": "mainTemplate",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('mainTemplate.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "clusterName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-12VNet"
+ },
+ "privateDomainName": {
+ "value": "hpc.local"
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "headNodeDiskType": {
+ "value": "HDD"
+ },
+ "computeNodeImageOsPlatform": {
+ "value": "Windows"
+ },
+ "computeNodeImagePublisher": {
+ "value": "(currentComputeNodeImage).publisher"
+ },
+ "computeNodeImageOffer": {
+ "value": "(currentComputeNodeImage).offer"
+ },
+ "computeNodeImageSku": {
+ "value": "(currentComputeNodeImage).sku"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeDiskType": {
+ "value": "HDD"
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ },
+ "publicIPName": {
+ "value": "GEN-UNIQUE-12-PublicIP-HN"
+ },
+ "publicIPRGName": {
+ "value": "[resourceGroup().name]"
+ },
+ "publicIPNewOrExisting": {
+ "value": "new"
+ },
+ "publicIPDNSNameLabel": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "headNodePostConfigScript": {
+ "value": "[trim(parameters('headNodePostConfigScript'))]"
+ },
+ "computeNodePostConfigScript": {
+ "value": "[trim(parameters('computeNodePostConfigScript'))]"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "clusterDnsName": {
+ "type": "string",
+ "value": "[reference('mainTemplate').outputs.clusterDNSName.value]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT673 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT673
new file mode 100644
index 0000000..b7dd6bf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT673
@@ -0,0 +1,220 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/headnode-rdma-disabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898896,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/headnode-rdma-disabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT673",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT673",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM name"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM role size"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The storage account type for the disks of the VM"
+ }
+ },
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "The network interface name"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name of the administrator"
+ },
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password of the administrator"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "availabilitySetName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The availability set name"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ }
+ },
+ "privateDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The fully qualified domain name (FQDN) for the private domain forest which will be created by this template, for example 'hpc.local'."
+ },
+ "value": "hpc.local"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "clusterName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmName",
+ "location": "location",
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServerHPCPack",
+ "offer": "WindowsServerHPCPack",
+ "sku": "2012R2",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "vmName-osdisk",
+ "caching": "ReadOnly",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ },
+ "dataDisks": [
+ {
+ "name": "vmName-datadisk",
+ "caching": "None",
+ "createOption": "Empty",
+ "diskSizeGB": 500,
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ },
+ "lun": 0
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicName"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/promoteDomainController",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmName"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.26",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "configuration": {
+ "url": "[uri(parameters('_artifactsLocation'), concat('CreateADPDC.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "script": "CreateADPDC.ps1",
+ "function": "CreateADPDC"
+ },
+ "configurationArguments": {
+ "DomainName": "hpc.local"
+ }
+ },
+ "protectedSettings": {
+ "configurationArguments": {
+ "AdminCreds": {
+ "UserName": "azureuser",
+ "Password": "GEN-PASSWORD"
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT674 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT674
new file mode 100644
index 0000000..682682c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT674
@@ -0,0 +1,241 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/headnode-rdma-enabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898905,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/headnode-rdma-enabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT674",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT674",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM name"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM role size"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The storage account type for the disks of the VM"
+ }
+ },
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "The network interface name"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name of the administrator"
+ },
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password of the administrator"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "availabilitySetName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The availability set name to join if specified"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ }
+ },
+ "privateDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The fully qualified domain name (FQDN) for the private domain forest which will be created by this template, for example 'hpc.local'."
+ },
+ "value": "hpc.local"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "clusterName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ }
+ },
+ "variables": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/ parameters('availabilitySetName')"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmName",
+ "location": "location",
+ "properties": {
+ "availabilitySet": "[if(empty(parameters('availabilitySetName')), json('null'), variables('availabilitySet'))]",
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServerHPCPack",
+ "offer": "WindowsServerHPCPack",
+ "sku": "2012R2",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "vmName-osdisk",
+ "caching": "ReadOnly",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ },
+ "dataDisks": [
+ {
+ "name": "vmName-datadisk",
+ "caching": "None",
+ "createOption": "Empty",
+ "diskSizeGB": 500,
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ },
+ "lun": 0
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicName"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/installRDMADriver",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmName"
+ ],
+ "properties": {
+ "publisher": "Microsoft.HpcCompute",
+ "type": "HpcVmDrivers",
+ "typeHandlerVersion": "1.1",
+ "autoUpgradeMinorVersion": true
+ }
+ },
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/promoteDomainController",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmName",
+ "Microsoft.Compute/virtualMachines/extensions/vmName/installRDMADriver"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.26",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "configuration": {
+ "url": "[uri(parameters('_artifactsLocation'), concat('CreateADPDC.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "script": "CreateADPDC.ps1",
+ "function": "CreateADPDC"
+ },
+ "configurationArguments": {
+ "DomainName": "hpc.local"
+ }
+ },
+ "protectedSettings": {
+ "configurationArguments": {
+ "AdminCreds": {
+ "UserName": "azureuser",
+ "Password": "GEN-PASSWORD"
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT675 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT675
new file mode 100644
index 0000000..df787a5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT675
@@ -0,0 +1,253 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/linuxnode.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898913,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/linuxnode.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT675",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT675",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "The network interface name for the VM"
+ }
+ },
+ "subnetId": {
+ "type": "string",
+ "metadata": {
+ "description": "The Id of the subnet in which the node is created"
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM name"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM role size"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The storage account type for the disks of the VM"
+ }
+ },
+ "imgPublisher": {
+ "type": "string",
+ "metadata": {
+ "description": "The publisher of the VM image"
+ }
+ },
+ "imgOffer": {
+ "type": "string",
+ "metadata": {
+ "description": "The offer of the VM image"
+ }
+ },
+ "imgSku": {
+ "type": "string",
+ "metadata": {
+ "description": "The sku of the VM image"
+ }
+ },
+ "imgVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "The version of the VM image"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name of the administrator"
+ },
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password of the administrator"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "availabilitySetName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The availability set name to join if specified"
+ }
+ },
+ "customData": {
+ "type": "string",
+ "metadata": {
+ "description": "The custom data in base64 format"
+ }
+ },
+ "clusterName": {
+ "type": "string",
+ "metadata": {
+ "description": "The HPC cluster name"
+ },
+ "value": "GEN-UNIQUE-12"
+ },
+ "privateDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The fully qualified domain name (FQDN) for the private domain forest which will be created by this template, for example 'hpc.local'."
+ },
+ "value": "hpc.local"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ }
+ },
+ "variables": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/ parameters('availabilitySetName')"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-02-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicName",
+ "location": "location",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IPConfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmName",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nicName"
+ ],
+ "properties": {
+ "availabilitySet": "[if(empty(parameters('availabilitySetName')), json('null'), variables('availabilitySet'))]",
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "customData": "customData",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": false
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "imgPublisher",
+ "offer": "imgOffer",
+ "sku": "imgSku",
+ "version": "imgVersion"
+ },
+ "osDisk": {
+ "name": "vmName-osdisk",
+ "caching": "ReadOnly",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicName"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/installHPCNodeAgent",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmName"
+ ],
+ "properties": {
+ "publisher": "Microsoft.HpcPack",
+ "type": "LinuxNodeAgent",
+ "typeHandlerVersion": "1.6",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "ClusterName": "GEN-UNIQUE-12.hpc.local"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT676 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT676
new file mode 100644
index 0000000..b1db60a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT676
@@ -0,0 +1,589 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/mainTemplate.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898922,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/mainTemplate.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT676",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.resources/deployments",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT676",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "clusterName": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 15,
+ "metadata": {
+ "description": "The HPC Pack cluster name, also used as the host name of the head node. It must contain between 3 and 15 characters with lowercase letters and numbers, and must start with a letter."
+ },
+ "value": "GEN-UNIQUE-12"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the virtual network to be created. It must contain between 2 and 63 characters, start with a letter, end with a letter or number, and may contain only letters, numbers, underscores, periods, or hyphens."
+ }
+ },
+ "privateDomainName": {
+ "type": "string",
+ "defaultValue": "hpc.local",
+ "metadata": {
+ "description": "The fully qualified domain name (FQDN) for the private domain forest which will be created by this template, for example 'hpc.local'."
+ },
+ "value": "hpc.local"
+ },
+ "headNodeVMSize": {
+ "type": "string",
+ "defaultValue": "Standard_D8s_v3",
+ "metadata": {
+ "description": "The VM size of the head node, all available VM sizes in Azure can be found at https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-sizes. Note that some VM sizes in the list are only available in some particular locations. Please check the availability and the price of the VM sizes at https://azure.microsoft.com/pricing/details/virtual-machines/windows/ before deployment."
+ },
+ "value": "Standard_D8_v3"
+ },
+ "headNodeDiskType": {
+ "type": "string",
+ "defaultValue": "SSD",
+ "allowedValues": [
+ "HDD",
+ "SSD"
+ ],
+ "metadata": {
+ "description": "The disk type of head node VM. Note that SSD only supports DS-series, DSv2-series, GS-series, and Fs-series VMs."
+ }
+ },
+ "computeNodeImageOsPlatform": {
+ "type": "string",
+ "allowedValues": [
+ "Windows",
+ "Linux"
+ ],
+ "metadata": {
+ "description": "The VM image OS platform for the compute nodes"
+ }
+ },
+ "computeNodeImagePublisher": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM image publisher for the compute nodes"
+ }
+ },
+ "computeNodeImageOffer": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM image offer for the compute nodes"
+ }
+ },
+ "computeNodeImageSku": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM image sku for the compute nodes"
+ }
+ },
+ "computeNodeNamePrefix": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 12,
+ "defaultValue": "IaaSCN",
+ "metadata": {
+ "description": "The name prefix of the compute nodes. It must be no more than 12 characters, begin with a letter, and contain only letters, numbers and hyphens. For example, if 'IaaSCN-' is specified, the compute node names will be 'IaaSCN-000', 'IaaSCN-001', ..."
+ },
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "type": "int",
+ "defaultValue": 10,
+ "minValue": 1,
+ "maxValue": 500,
+ "metadata": {
+ "description": "The number of the compute nodes"
+ },
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4_v3",
+ "metadata": {
+ "description": "The VM size of the compute nodes, all available VM sizes in Azure can be found at https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-sizes. Note that some VM sizes in the list are only available in some particular locations. Please check the availability and the price of the VM sizes at https://azure.microsoft.com/pricing/details/virtual-machines/windows/ before deployment."
+ },
+ "value": "Standard_D4_v3"
+ },
+ "computeNodeDiskType": {
+ "type": "string",
+ "defaultValue": "HDD",
+ "allowedValues": [
+ "HDD",
+ "SSD"
+ ],
+ "metadata": {
+ "description": "The disk type of the compute node VMs. Note that SSD only supports DS-series, DSv2-series, GS-series, and Fs-series VMs."
+ }
+ },
+ "publicIPName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the public IP address"
+ }
+ },
+ "publicIPRGName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Resource group for the public IP address resource"
+ }
+ },
+ "publicIPNewOrExisting": {
+ "type": "string",
+ "defaultValue": "new",
+ "allowedValues": [
+ "new",
+ "existing"
+ ],
+ "metadata": {
+ "description": "Indicates whether the public IP address is new or existing"
+ }
+ },
+ "publicIPDNSNameLabel": {
+ "type": "string",
+ "metadata": {
+ "description": "The DNS name label of the public IP address"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Administrator user name for the virtual machines and the Active Directory domain."
+ },
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Administrator password for the virtual machines and the Active Directory domain"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "headNodePostConfigScript": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Optional URL of a public available PowerShell script you want to run on the head node after it is configured. The script will be run as the Local System account. You can also specify arguments for the script, for example 'http://www.contoso.com/myhnpostscript.ps1 -Arg1 arg1 -Arg2 arg2'."
+ }
+ },
+ "computeNodePostConfigScript": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Optional URL of a public available PowerShell script you want to run on the compute nodes after they are configured. The script will be run as the Local System account. You can also specify arguments for the script, for example 'http://www.contoso.com/mycnpostscript.ps1 -Arg1 arg1 -Arg2 arg2'."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ }
+ },
+ "variables": {
+ "storageAccountTypes": {
+ "HDD": "Standard_LRS",
+ "SSD": "Premium_LRS"
+ },
+ "hnStorageAccountName": "[toLower(concat('hpc', uniqueString(resourceGroup().id, toLower(parameters('clusterName')))))]",
+ "hnStorageAccountId": "Microsoft.Storage/storageAccounts/[toLower(concat('hpc', uniqueString(resourceGroup().id, toLower(parameters('clusterName')))))]",
+ "addressPrefix": "10.0.0.0/16",
+ "subnet1Name": "Subnet-1",
+ "subnet1Prefix": "10.0.0.0/22",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/virtualNetworkName/Subnet-1",
+ "publicIPAddressType": "Dynamic",
+ "availabilitySetNamePrefix": "GEN-UNIQUE-12-avset",
+ "nbrVMPerAvailabilitySet": 180,
+ "availabilitySetNumber": "[add(div(parameters('computeNodeNumber'), variables('nbrVMPerAvailabilitySet')), 1)]",
+ "nicNameSuffix": "[concat('-nic', uniqueString(variables('subnetRef')))]",
+ "nicNameHN": "[concat(parameters('clusterName'), variables('nicNameSuffix'))]",
+ "vmSizeSuffix": "[uniqueString(resourceGroup().id)]",
+ "suffixA8Size": "Standard_A8[uniqueString(resourceGroup().id)]",
+ "suffixA9Size": "Standard_A9[uniqueString(resourceGroup().id)]",
+ "suffixH16rSize": "Standard_H16r[uniqueString(resourceGroup().id)]",
+ "suffixH16mrSize": "Standard_H16mr[uniqueString(resourceGroup().id)]",
+ "suffixNC24rSize": "Standard_NC24r[uniqueString(resourceGroup().id)]",
+ "suffixHNSize": "Standard_D8_v3[uniqueString(resourceGroup().id)]",
+ "suffixCNSize": "Standard_D4_v3[uniqueString(resourceGroup().id)]",
+ "cnRDMACapable": "[replace(replace(replace(replace(replace(replace(variables('suffixCNSize'), variables('suffixA8Size'), 'enabled'), variables('suffixA9Size'), 'enabled'), variables('suffixH16rSize'), 'enabled'), variables('suffixH16mrSize'), 'enabled'), variables('suffixNC24rSize'), 'enabled'), variables('suffixCNSize'), 'disabled')]",
+ "hnRDMACapable": "[replace(replace(replace(replace(replace(replace(variables('suffixHNSize'), variables('suffixA8Size'), 'enabled'), variables('suffixA9Size'), 'enabled'), variables('suffixH16rSize'), 'enabled'), variables('suffixH16mrSize'), 'enabled'), variables('suffixNC24rSize'), 'enabled'), variables('suffixHNSize'), 'disabled')]",
+ "hnRDMAJumpBox": {
+ "disabled-disabled": "disabled",
+ "disabled-enabled": "disabled",
+ "enabled-disabled": "disabled",
+ "enabled-enabled": "enabled"
+ },
+ "hnRDMAState": "(hnRDMAJumpBox)[concat(variables(hnRDMACapable), -, variables(cnRDMACapable))]",
+ "cnRDMAState": "[replace(replace(replace(replace(replace(replace(variables('suffixCNSize'), variables('suffixA8Size'), 'enabled'), variables('suffixA9Size'), 'enabled'), variables('suffixH16rSize'), 'enabled'), variables('suffixH16mrSize'), 'enabled'), variables('suffixNC24rSize'), 'enabled'), variables('suffixCNSize'), 'disabled')]",
+ "cnOsPlatformRelated": {
+ "Linux": {
+ "template": "linuxnode.json"
+ },
+ "Windows": {
+ "template": "windowsnode-rdma-[replace(replace(replace(replace(replace(replace(variables('suffixCNSize'), variables('suffixA8Size'), 'enabled'), variables('suffixA9Size'), 'enabled'), variables('suffixH16rSize'), 'enabled'), variables('suffixH16mrSize'), 'enabled'), variables('suffixNC24rSize'), 'enabled'), variables('suffixCNSize'), 'disabled')].json"
+ }
+ },
+ "curCNOSPlatformRelated": "(cnOsPlatformRelated)[parameters(computeNodeImageOsPlatform)]",
+ "computeNodeTemplateUrl": "[uri(parameters('_artifactsLocation'), concat(variables('curCNOSPlatformRelated').template, parameters('_artifactsLocationSasToken')))]",
+ "computeNodeCustomData": "[base64(concat('HPCClusterName=', parameters('clusterName'), '\r\nImageCategory=public\r\nImageName=', parameters('computeNodeImageOffer'), '-', parameters('computeNodeImageSku'), '\r\nVMSize=', parameters('computeNodeVMSize')))]",
+ "adminBase64Password": "[base64(parameters('adminPassword'))]",
+ "iaasInfoArg": "[concat('-SubscriptionId ', subscription().subscriptionId, ' -VNet ', parameters('virtualNetworkName'), ' -Subnet ', variables('subnet1Name'), ' -Location \"', parameters('location'), '\" -ResourceGroup ', resourceGroup().name)]",
+ "headNodeCommandStr": "[concat('powershell.exe -ExecutionPolicy Unrestricted -File PrepareHN.ps1 -DomainFQDN ', parameters('privateDomainName'), ' -AdminUserName ', parameters('adminUsername'), ' -AdminBase64Password \"', variables('adminBase64Password'), '\" -CNSize ', parameters('computeNodeVMSize'), ' -PostConfigScript \"', base64(trim(parameters('headNodePostConfigScript'))), '\" ', variables('iaasInfoArg'))]",
+ "hnStorageConnStrPrefix": "DefaultEndpointsProtocol=https;AccountName=[toLower(concat('hpc', uniqueString(resourceGroup().id, toLower(parameters('clusterName')))))];AccountKey="
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[toLower(concat('hpc', uniqueString(resourceGroup().id, toLower(parameters('clusterName')))))]",
+ "apiVersion": "2021-04-01",
+ "location": "location",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2017-10-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "virtualNetworkName",
+ "location": "location",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/22"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "setupClusterPublicIP",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2017-05-10",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('publicip-', parameters('publicIPNewOrExisting'), '.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "publicIPAddressName": {
+ "value": "publicIPName"
+ },
+ "publicIPAddressType": {
+ "value": "Dynamic"
+ },
+ "domainNameLabel": {
+ "value": "publicIPDNSNameLabel"
+ },
+ "publicIPRGName": {
+ "value": "publicIpRGName"
+ },
+ "location": {
+ "value": "location"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-10-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[variables('nicNameHN')]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//virtualNetworkName",
+ "Microsoft.Resources/deployments/setupClusterPublicIP"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IPConfig",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.0.4",
+ "publicIPAddress": {
+ "id": "[reference('setupClusterPublicIP').outputs.resourceId.value]"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/virtualNetworkName/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "[concat(variables('availabilitySetNamePrefix'), padLeft(string(copyIndex()), 2, '0'))]",
+ "location": "location",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformUpdateDomainCount": 5,
+ "platformFaultDomainCount": 2
+ },
+ "copy": {
+ "name": "availabilitySetCopy",
+ "count": "[add(div(parameters('computeNodeNumber'), variables('nbrVMPerAvailabilitySet')), 1)]"
+ }
+ },
+ {
+ "apiVersion": "2017-05-10",
+ "type": "Microsoft.Resources/deployments",
+ "name": "createHeadNode",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicNameHN'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('hnStorageAccountName'))]",
+ "availabilitySetCopy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'),concat('headnode-rdma-', variables('hnRDMAState'), '.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "vmName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "vmSize": {
+ "value": "Standard_D8_v3"
+ },
+ "storageAccountType": {
+ "value": "(storageAccountTypes)[parameters(headNodeDiskType)]"
+ },
+ "nicName": {
+ "value": "[variables('nicNameHN')]"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "availabilitySetName": {
+ "value": "GEN-UNIQUE-12-avset00"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "privateDomainName": {
+ "value": "hpc.local"
+ },
+ "location": {
+ "value": "location"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-05-10",
+ "type": "Microsoft.Resources/deployments",
+ "name": "updateVNetDNS",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/createHeadNode"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('vnet-with-dns-server.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "virtualNetworkName": {
+ "value": "virtualNetworkName"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "value": "Subnet-1"
+ },
+ "subnetRange": {
+ "value": "10.0.0.0/22"
+ },
+ "DNSServerAddress": {
+ "value": [
+ "10.0.0.4",
+ "8.8.8.8"
+ ]
+ },
+ "location": {
+ "value": "location"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-12/configureHeadNode",
+ "apiVersion": "2017-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/updateVNetDNS"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.9",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('PrepareHN.ps1', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('HPCHNPrepare.ps1', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "[concat(variables('headNodeCommandStr'), ' -AzureStorageConnStr \"', variables('hnStorageConnStrPrefix'), listKeys(variables('hnStorageAccountId'),'2017-10-01').keys[0].value, '\" -PublicDnsName ', reference('setupClusterPublicIP').outputs.fqdn.value)]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-05-10",
+ "type": "Microsoft.Resources/deployments",
+ "name": "[concat('create', parameters('computeNodeNamePrefix'), padLeft(string(copyIndex()), 3, '0'))]",
+ "dependsOn": [
+ "availabilitySetCopy",
+ "Microsoft.Resources/deployments/updateVNetDNS"
+ ],
+ "copy": {
+ "name": "CN",
+ "count": 2
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(variables('curCNOSPlatformRelated').template, parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "nicName": {
+ "value": "[concat(parameters('computeNodeNamePrefix'), padLeft(string(copyIndex()), 3, '0'), variables('nicNameSuffix'))]"
+ },
+ "subnetId": {
+ "value": "Microsoft.Network/virtualNetworks/subnets/virtualNetworkName/Subnet-1"
+ },
+ "vmName": {
+ "value": "[concat(parameters('computeNodeNamePrefix'), padLeft(string(copyIndex()), 3, '0'))]"
+ },
+ "vmSize": {
+ "value": "Standard_D4_v3"
+ },
+ "storageAccountType": {
+ "value": "(storageAccountTypes)[parameters(computeNodeDiskType)]"
+ },
+ "imgPublisher": {
+ "value": "computeNodeImagePublisher"
+ },
+ "imgOffer": {
+ "value": "computeNodeImageOffer"
+ },
+ "imgSku": {
+ "value": "computeNodeImageSku"
+ },
+ "imgVersion": {
+ "value": "latest"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "availabilitySetName": {
+ "value": "[concat(variables('availabilitySetNamePrefix'), padLeft(string(div(add(copyIndex(), 1), variables('nbrVMPerAvailabilitySet'))), 2, '0'))]"
+ },
+ "customData": {
+ "value": "[base64(concat('HPCClusterName=', parameters('clusterName'), '\r\nImageCategory=public\r\nImageName=', parameters('computeNodeImageOffer'), '-', parameters('computeNodeImageSku'), '\r\nVMSize=', parameters('computeNodeVMSize')))]"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "clusterName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "privateDomainName": {
+ "value": "hpc.local"
+ },
+ "computeNodePostConfigScript": {
+ "value": "[trim(parameters('computeNodePostConfigScript'))]"
+ },
+ "location": {
+ "value": "location"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "clusterDNSName": {
+ "type": "string",
+ "value": "[reference('setupClusterPublicIP').outputs.fqdn.value]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT677 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT677
new file mode 100644
index 0000000..2eaa13b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT677
@@ -0,0 +1,82 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/publicip-existing.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898936,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/publicip-existing.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT677",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": []
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT677",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicIPAddressName": {
+ "type": "string"
+ },
+ "publicIpRGName": {
+ "type": "string"
+ },
+ "clusterName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "privateDomainName": {
+ "value": "hpc.local"
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ }
+ },
+ "variables": {
+ "publicIpId": "publicIpRGName/Microsoft.Network/publicIPAddresses/publicIPAddressName"
+ },
+ "resources": [],
+ "outputs": {
+ "resourceId": {
+ "type": "string",
+ "value": "[variables('publicIpId')]"
+ },
+ "fqdn": {
+ "value": "[reference(variables('publicIpId'),'2017-10-01').dnsSettings.fqdn]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT678 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT678
new file mode 100644
index 0000000..348d91e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT678
@@ -0,0 +1,109 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/publicip-new.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898963,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/publicip-new.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT678",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT678",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicIPAddressName": {
+ "type": "string"
+ },
+ "publicIPAddressType": {
+ "type": "string"
+ },
+ "domainNameLabel": {
+ "type": "string"
+ },
+ "publicIpRGName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "clusterName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "privateDomainName": {
+ "value": "hpc.local"
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ }
+ },
+ "variables": {
+ "publicIpId": "Microsoft.Network/publicIPAddresses/publicIPAddressName"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIPAddressName",
+ "apiVersion": "2021-02-01",
+ "location": "location",
+ "properties": {
+ "publicIPAllocationMethod": "publicIPAddressType",
+ "dnsSettings": {
+ "domainNameLabel": "domainNameLabel"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "resourceId": {
+ "type": "string",
+ "value": "[variables('publicIpId')]"
+ },
+ "fqdn": {
+ "value": "[reference(variables('publicIpId'),'2017-10-01').dnsSettings.fqdn]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT679 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT679
new file mode 100644
index 0000000..0969249
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT679
@@ -0,0 +1,128 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/vnet-with-dns-server.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898972,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/vnet-with-dns-server.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT679",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT679",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Virtual Network to Create"
+ }
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "The address range of the new VNET in CIDR format"
+ },
+ "defaultValue": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the subnet created in the new VNET"
+ }
+ },
+ "subnetRange": {
+ "type": "string",
+ "metadata": {
+ "description": "The address range of the subnet created in the new VNET"
+ },
+ "defaultValue": "10.0.0.0/24"
+ },
+ "DNSServerAddress": {
+ "type": "array",
+ "metadata": {
+ "description": "The DNS address(es) of the DNS Server(s) used by the VNET"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "clusterName": {
+ "value": "GEN-UNIQUE-12"
+ },
+ "privateDomainName": {
+ "value": "hpc.local"
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ },
+ "adminUsername": {
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ }
+ },
+ "resources": [
+ {
+ "name": "virtualNetworkName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2021-02-01",
+ "location": "location",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "dhcpOptions": {
+ "dnsServers": "DNSServerAddress"
+ },
+ "subnets": [
+ {
+ "name": "subnetName",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT68 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT68
new file mode 100644
index 0000000..38251f3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT68
@@ -0,0 +1,428 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-orchestrator.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884692,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-orchestrator.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT68",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.resources/deployments",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT68",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicIPDomainNameLabelOrchServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "networkSecurityGroupNameOrchServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "networkInterfaceNameOrchServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmNameOrchServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmAdminUsernameOrchServer": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "storageAccountName": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmStorageAccountContainerName": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "network-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "compute-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "deployment-api-version2": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tagvalues": {
+ "type": "object",
+ "defaultValue": ""
+ },
+ "imagePublisherLinux": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "imageOfferLinux": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "orcServerubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmSizeOrcServer": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet2Ref": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "installOrchTemplateurl": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "vmAdminPasswordOrPublicKeyOrchServer": {
+ "type": "securestring"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {
+ "publicIPAddressNameOrchServer": "publicipOrchestratorServer",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/ parameters('vmAdminUsernameOrchServer')/.ssh/authorized_keys",
+ "keyData": "vmAdminPasswordOrPublicKeyOrchServer"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "",
+ "apiVersion": "2017-03-30",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": ""
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "",
+ "offer": "",
+ "sku": "",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "parameters('vmNameOrchServer')-osDisk",
+ "createOption": "FromImage",
+ "caching": "ReadWrite"
+ },
+ "dataDisks": []
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "secrets": [],
+ "adminPassword": "vmAdminPasswordOrPublicKeyOrchServer",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/ parameters('networkInterfaceNameOrchServer')"
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/ parameters('networkInterfaceNameOrchServer')"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('vmNameOrchServer')/installdockerandcompose",
+ "apiVersion": "2015-05-01-preview",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('vmNameOrchServer')"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "DockerExtension",
+ "typeHandlerVersion": "1.1",
+ "autoUpgradeMinorVersion": true,
+ "settings": {}
+ }
+ },
+ {
+ "name": "orchestratorapplication",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('vmNameOrchServer')/extensions/installdockerandcompose"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "westus"
+ },
+ "vmName": {
+ "value": ""
+ },
+ "datameerTags": {
+ "value": "datameerTags"
+ },
+ "trendmicroTags": {
+ "value": "trendmicroTags"
+ },
+ "chefSoftwareTags": {
+ "value": "chefSoftwareTags"
+ },
+ "quickstartTags": {
+ "value": "quickstartTags"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicipOrchestratorServer",
+ "apiVersion": "2017-06-01",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": ""
+ },
+ "idleTimeoutInMinutes": 4
+ },
+ "dependsOn": []
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "",
+ "apiVersion": "2017-06-01",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicipOrchestratorServer"
+ },
+ "subnet": {
+ "id": ""
+ }
+ }
+ }
+ ],
+ "dnsSettings": {
+ "dnsServers": []
+ },
+ "enableIPForwarding": false,
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/ parameters('networkSecurityGroupNameOrchServer')"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/publicipOrchestratorServer",
+ "Microsoft.Network/networkSecurityGroups/ parameters('networkSecurityGroupNameOrchServer')"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "",
+ "apiVersion": "2017-06-01",
+ "location": "westus",
+ "tags": {
+ "program": null,
+ "project": null,
+ "quickstartName": "quickstartTags",
+ "provider": "chefSoftwareTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1010,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1020,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "https",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1030,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "https8443",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1040,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http33001",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "33001",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1050,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ },
+ "dependsOn": []
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT680 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT680
new file mode 100644
index 0000000..f32fe24
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT680
@@ -0,0 +1,280 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/windowsnode-rdma-disabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898980,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/windowsnode-rdma-disabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT680",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT680",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "The network interface name for the VM"
+ }
+ },
+ "subnetId": {
+ "type": "string",
+ "metadata": {
+ "description": "The Id of the subnet in which the node is created"
+ }
+ },
+ "availabilitySetName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The availability set name to join if specified"
+ }
+ },
+ "clusterName": {
+ "type": "string",
+ "metadata": {
+ "description": "The HPC cluster name"
+ },
+ "value": "GEN-UNIQUE-12"
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM name"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM role size"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The storage account type for the disks of the VM"
+ }
+ },
+ "imgPublisher": {
+ "type": "string",
+ "metadata": {
+ "description": "The publisher of the VM image"
+ }
+ },
+ "imgOffer": {
+ "type": "string",
+ "metadata": {
+ "description": "The offer of the VM image"
+ }
+ },
+ "imgSku": {
+ "type": "string",
+ "metadata": {
+ "description": "The sku of the VM image"
+ }
+ },
+ "imgVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "The version of the VM image"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name of the administrator"
+ },
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password of the administrator"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "customData": {
+ "type": "string",
+ "metadata": {
+ "description": "The custom data in base64 format"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ }
+ },
+ "privateDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The fully qualified domain name (FQDN) for the private domain forest which will be created by this template, for example 'hpc.local'."
+ },
+ "value": "hpc.local"
+ },
+ "computeNodePostConfigScript": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Optional URL of a public available PowerShell script you want to run on the compute nodes after they are configured. You can also specify arguments for the script, for example 'http://www.consto.com/mypostscript.ps1 -Arg1 arg1 -Arg2 arg2'."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "apiVersion": "2021-02-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicName",
+ "location": "location",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IPConfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmName",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nicName"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "customData": "customData"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "imgPublisher",
+ "offer": "imgOffer",
+ "sku": "imgSku",
+ "version": "imgVersion"
+ },
+ "osDisk": {
+ "name": "vmName-osdisk",
+ "caching": "ReadOnly",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicName"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/configureComputeNode",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmName"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.26",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "configuration": {
+ "url": "[uri(parameters('_artifactsLocation'), concat('ConfigComputeNode.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "script": "ConfigComputeNode.ps1",
+ "function": "ConfigComputeNode"
+ },
+ "configurationArguments": {
+ "DomainName": "hpc.local",
+ "PostConfigScript": ""
+ }
+ },
+ "protectedSettings": {
+ "configurationArguments": {
+ "AdminCreds": {
+ "UserName": "azureuser",
+ "Password": "GEN-PASSWORD"
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT681 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT681
new file mode 100644
index 0000000..3759ca3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT681
@@ -0,0 +1,301 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/create-hpc-cluster/windowsnode-rdma-enabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962898988,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/create-hpc-cluster/windowsnode-rdma-enabled.json",
+ "/demos/create-hpc-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT681",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT681",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "The network interface name for the VM"
+ }
+ },
+ "subnetId": {
+ "type": "string",
+ "metadata": {
+ "description": "The Id of the subnet in which the node is created"
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM name"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The VM role size"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The storage account type for the disks of the VM"
+ }
+ },
+ "imgPublisher": {
+ "type": "string",
+ "metadata": {
+ "description": "The publisher of the VM image"
+ }
+ },
+ "imgOffer": {
+ "type": "string",
+ "metadata": {
+ "description": "The offer of the VM image"
+ }
+ },
+ "clusterName": {
+ "type": "string",
+ "metadata": {
+ "description": "The HPC cluster name"
+ },
+ "value": "GEN-UNIQUE-12"
+ },
+ "imgSku": {
+ "type": "string",
+ "metadata": {
+ "description": "The sku of the VM image"
+ }
+ },
+ "imgVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "The version of the VM image"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name of the administrator"
+ },
+ "value": "azureuser"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password of the administrator"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "availabilitySetName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The availability set name to join if specified"
+ }
+ },
+ "customData": {
+ "type": "string",
+ "metadata": {
+ "description": "The custom data in base64 format"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ }
+ },
+ "privateDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The fully qualified domain name (FQDN) for the private domain forest which will be created by this template, for example 'hpc.local'."
+ },
+ "value": "hpc.local"
+ },
+ "computeNodePostConfigScript": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Optional URL of a public available PowerShell script you want to run on the compute nodes after they are configured. You can also specify arguments for the script, for example 'http://www.consto.com/mypostscript.ps1 -Arg1 arg1 -Arg2 arg2'."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "headNodeVMSize": {
+ "value": "Standard_D8_v3"
+ },
+ "computeNodeImage": {
+ "value": "ComputeNode"
+ },
+ "computeNodeNamePrefix": {
+ "value": "IaaSCN-"
+ },
+ "computeNodeNumber": {
+ "value": 2
+ },
+ "computeNodeVMSize": {
+ "value": "Standard_D4_v3"
+ }
+ },
+ "variables": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/ parameters('availabilitySetName')"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-02-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicName",
+ "location": "location",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IPConfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmName",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nicName"
+ ],
+ "properties": {
+ "availabilitySet": "[if(empty(parameters('availabilitySetName')), json('null'), variables('availabilitySet'))]",
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "customData": "customData"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "imgPublisher",
+ "offer": "imgOffer",
+ "sku": "imgSku",
+ "version": "imgVersion"
+ },
+ "osDisk": {
+ "name": "vmName-osdisk",
+ "caching": "ReadOnly",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicName"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/installRDMADriver",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmName"
+ ],
+ "properties": {
+ "publisher": "Microsoft.HpcCompute",
+ "type": "HpcVmDrivers",
+ "typeHandlerVersion": "1.1",
+ "autoUpgradeMinorVersion": true
+ }
+ },
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmName/configureComputeNode",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmName",
+ "Microsoft.Compute/virtualMachines/extensions/vmName/installRDMADriver"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.26",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "configuration": {
+ "url": "[uri(parameters('_artifactsLocation'), concat('ConfigComputeNode.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "script": "ConfigComputeNode.ps1",
+ "function": "ConfigComputeNode"
+ },
+ "configurationArguments": {
+ "DomainName": "hpc.local",
+ "PostConfigScript": ""
+ }
+ },
+ "protectedSettings": {
+ "configurationArguments": {
+ "AdminCreds": {
+ "UserName": "azureuser",
+ "Password": "GEN-PASSWORD"
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT682 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT682
new file mode 100644
index 0000000..a579032
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT682
@@ -0,0 +1,1051 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/custom-private-dns/nested/linux-client/setuplinuxclient.json"
+ ],
+ "timestamp": 1642962898996,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/custom-private-dns/nested/linux-client/setuplinuxclient.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT682",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT682",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmList": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "List of virtual machines to be configured. If using multiple VMs, make their names comma separate, e.g. VM01,VM02,VM03."
+ }
+ },
+ "dnsZone": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the dnsZone to use as the suffix on the clients and to register records in"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and scripts, that this script depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "vmListArray": "[split(replace(parameters('vmList'),' ',''),',')]"
+ },
+ "resources": [
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable DDNS",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/ddns-dhcphook', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh setuplinuxclient.sh dnsZone"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT683 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT683
new file mode 100644
index 0000000..09698e7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT683
@@ -0,0 +1,1009 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/custom-private-dns/nested/server/setupserver.json"
+ ],
+ "timestamp": 1642962899006,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/custom-private-dns/nested/server/setupserver.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT683",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT683",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmList": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "List of virtual machines to be configured. If using multiple VMs, make their names comma separate, e.g. VM01,VM02,VM03."
+ }
+ },
+ "dnsZone": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the forward dnsZone to configure for updates"
+ }
+ },
+ "vnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the vnet for which to create the reverse DNS zone"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and scripts, that this script depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "vmListArray": "[split(replace(parameters('vmList'),' ',''),',')]",
+ "vnetID": "Microsoft.Network/virtualNetworks//vnetName"
+ },
+ "resources": [
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ },
+ {
+ "comments": "DNS server setup - assumes AD has already been setup",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsServer')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File nested/server/setupserver.ps1', ' ', parameters('dnsZone'), ' ', reference(variables('vnetID'), '2016-12-01').addressSpace.addressPrefixes[0])]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT684 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT684
new file mode 100644
index 0000000..6a0ceb7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT684
@@ -0,0 +1,1002 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/custom-private-dns/nested/windows-client/setupwinclient.json"
+ ],
+ "timestamp": 1642962899025,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/custom-private-dns/nested/windows-client/setupwinclient.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT684",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT684",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmList": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "List of virtual machines to be configured. If using multiple VMs, make their names comma separate, e.g. VM01,VM02,VM03."
+ }
+ },
+ "dnsZone": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the dnsZone to use as the suffix on the clients and to register records in"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and scripts, that this script depends on"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "vmListArray": "[split(replace(parameters('vmList'),' ',''),',')]"
+ },
+ "resources": [
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ },
+ {
+ "comments": "DNS client setup - set suffix and enable PTR record registration",
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmListArray')[copyIndex()],'/SetupDnsClient')]",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.8",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File nested/windows-client/setupwinclient.ps1 dnsZone"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT685 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT685
new file mode 100644
index 0000000..d214250
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT685
@@ -0,0 +1,154 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/custom-private-dns/nested/genericvm.json"
+ ],
+ "timestamp": 1642962899067,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/custom-private-dns/nested/genericvm.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT685",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT685",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "subnetId": {
+ "type": "string",
+ "metadata": {
+ "description": "Reference to the subnet to put the VM's NIC in"
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the VM, also sets the computer name and is the based for the NIC's name"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The size of the VM"
+ },
+ "defaultValue": "Standard_A1"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Administrator of the new VM and Domain"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the Administrator account of the new VM and Domain"
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "nicName": "vmName-nic"
+ },
+ "resources": [
+ {
+ "name": "vmName-nic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-08-01",
+ "location": "location",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "vmName",
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/vmName-nic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "imagePublisher",
+ "offer": "imageOffer",
+ "sku": "imageSKU",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "vmName_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmName-nic"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT686 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT686
new file mode 100644
index 0000000..400f7f1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT686
@@ -0,0 +1,305 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/custom-private-dns/azuredeploy.json",
+ "/demos/custom-private-dns/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899078,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/custom-private-dns/azuredeploy.json",
+ "/demos/custom-private-dns/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT686",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT686",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "virtualMachineName": {
+ "type": "string",
+ "defaultValue": "ad-vm",
+ "metadata": {
+ "description": "Virtual machine name."
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "dnsZoneName": {
+ "type": "string",
+ "defaultValue": "private.local",
+ "metadata": {
+ "description": "The private DNS suffix and zone name."
+ },
+ "value": "private.local"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Administrator of the new VM and Domain"
+ },
+ "defaultValue": "adAdministrator",
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the Administrator account of the new VM and Domain"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "comments": "This uses one of the other templates to deploy a pair of AD controllers",
+ "name": "adDeployment",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/modules/active-directory-new-domain/0.9/azuredeploy.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "domainName": {
+ "value": "private.local"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "virtualMachineName": {
+ "value": "GEN-UNIQUE-10"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment modifies the DNS servers to allow dynamic and reverse DNS",
+ "name": "setupServer",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/adDeployment"
+ ],
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/server/setupserver.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "vmList": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "dnsZone": {
+ "value": "private.local"
+ },
+ "vnetName": {
+ "value": "[reference('adDeployment').outputs.virtualNetworkName.value]"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "Create an example Windows client VM",
+ "name": "setupWindowsClient",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/setupServer"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/genericvm.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "vmName": {
+ "value": "WindowsClient"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "subnetId": {
+ "value": "[resourceId(reference('adDeployment').outputs.virtualNetworkResourceGroupName.value, 'Microsoft.Network/virtualNetworks/subnets', reference('adDeployment').outputs.virtualNetworkName.value, reference('adDeployment').outputs.virtualNetworkSubnetName.value)]"
+ },
+ "imagePublisher": {
+ "value": "MicrosoftWindowsServer"
+ },
+ "imageOffer": {
+ "value": "WindowsServer"
+ },
+ "imageSKU": {
+ "value": "2012-R2-Datacenter"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "Install the extension on the Windows Client",
+ "name": "WindowsExtension",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/setupWindowsClient"
+ ],
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/windows-client/setupwinclient.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "vmList": {
+ "value": "WindowsClient"
+ },
+ "dnsZone": {
+ "value": "private.local"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "Create an example Ubuntu client VM",
+ "name": "setupLinuxClient",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/setupServer"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/genericvm.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "vmName": {
+ "value": "LinuxClient"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "subnetId": {
+ "value": "[resourceId(reference('adDeployment').outputs.virtualNetworkResourceGroupName.value, 'Microsoft.Network/virtualNetworks/subnets', reference('adDeployment').outputs.virtualNetworkName.value, reference('adDeployment').outputs.virtualNetworkSubnetName.value)]"
+ },
+ "imagePublisher": {
+ "value": "Canonical"
+ },
+ "imageOffer": {
+ "value": "UbuntuServer"
+ },
+ "imageSKU": {
+ "value": "14.04.5-LTS"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "Install the extension on the Linux Client",
+ "name": "LinuxExtension",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/setupLinuxClient"
+ ],
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/linux-client/setuplinuxclient.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "vmList": {
+ "value": "LinuxClient"
+ },
+ "dnsZone": {
+ "value": "private.local"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT687 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT687
new file mode 100644
index 0000000..06785c9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT687
@@ -0,0 +1,154 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.compute/vm.windows.json"
+ ],
+ "timestamp": 1642962899091,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.compute/vm.windows.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT687",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT687",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the virtual machine"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin user name for the virtual machine"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin user password for virtual machine"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size of VM"
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer"
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer"
+ },
+ "osSku": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "metadata": {
+ "description": "OS sku for VM"
+ }
+ },
+ "nicId": {
+ "type": "string",
+ "metadata": {
+ "description": "Network interface id."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "VM deployment location."
+ }
+ },
+ "dataDiskSizeInGB": {
+ "type": "int",
+ "defaultValue": 128,
+ "metadata": {
+ "description": "Size for Data Disks."
+ }
+ },
+ "numberOfDataDisks": {
+ "type": "int",
+ "minValue": 0,
+ "maxValue": 16,
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The number of dataDisks to be returned in the output array."
+ }
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2018-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "copy": [
+ {
+ "name": "dataDisks",
+ "count": 1,
+ "input": {
+ "diskSizeGB": 128,
+ "lun": "[copyIndex('dataDisks')]",
+ "createOption": "Empty"
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "nicId"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT688 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT688
new file mode 100644
index 0000000..a853042
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT688
@@ -0,0 +1,407 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.loganalytics/workspaces.json"
+ ],
+ "timestamp": 1642962899100,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.loganalytics/workspaces.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT688",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions",
+ "microsoft.operationalinsights/workspaces/datasources"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT688",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ },
+ "omsSolutionsName": {
+ "type": "array"
+ },
+ "tags": {
+ "type": "object"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode"
+ ],
+ "defaultValue": "Free",
+ "metadata": {
+ "description": "Service Tier: Free, Standalone, or PerNode"
+ }
+ },
+ "dataRetention": {
+ "type": "int",
+ "defaultValue": 90,
+ "minValue": 7,
+ "maxValue": 730,
+ "metadata": {
+ "description": "Number of days of retention. Free plans can only have 7 days, Standalone and OMS plans include 30 days for free"
+ }
+ },
+ "location": {
+ "type": "string",
+ "allowedValues": [
+ "East US",
+ "West Europe",
+ "Southeast Asia",
+ "Australia Southeast"
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "[concat('oms-workspace',uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2017-04-26-preview",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "sku": {
+ "name": "Free"
+ },
+ "retention": 90
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces/datasources",
+ "kind": "AzureActivityLog",
+ "name": "[concat(parameters('omsWorkspaceName'), '/', subscription().subscriptionId)]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "linkedResourceId": "[concat(subscription().Id, '/providers/microsoft.insights/eventTypes/management')]"
+ }
+ }
+ ],
+ "outputs": {
+ "workspaceName": {
+ "type": "string",
+ "value": "[parameters('omsWorkspaceName')]"
+ },
+ "workspaceId": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2017-04-26-preview').customerId]"
+ },
+ "workspaceKey": {
+ "type": "string",
+ "value": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2017-04-26-preview').primarySharedKey]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT689 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT689
new file mode 100644
index 0000000..33c0364
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT689
@@ -0,0 +1,91 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/nic-with-pip.json"
+ ],
+ "timestamp": 1642962899116,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/nic-with-pip.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT689",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT689",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "nicName": {
+ "type": "string"
+ },
+ "publicIPAddressId": {
+ "type": "string"
+ },
+ "subnetId": {
+ "type": "string"
+ },
+ "privateIPAllocationMethod": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic",
+ "Static"
+ ]
+ },
+ "location": {
+ "type": "string"
+ },
+ "nsgId": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2018-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "networkSecurityGroup": {
+ "id": ""
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "publicIPAddressId"
+ },
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT69 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT69
new file mode 100644
index 0000000..c080e1b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT69
@@ -0,0 +1,450 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-splunkenterprise.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884775,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-splunkenterprise.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT69",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT69",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "network-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "compute-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmNameSplunkEnterprise": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmAdminUsernameSplunkEnterprise": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "vmAdminPasswordSplunkEnterprise": {
+ "defaultValue": "",
+ "type": "SecureString"
+ },
+ "splunkAdminPassword": {
+ "defaultValue": "",
+ "type": "SecureString"
+ },
+ "publicIPAddressSettingsSplunk": {
+ "type": "object",
+ "metadata": {
+ "description": "Public IP address settings object"
+ }
+ },
+ "networkSecurityGroupNameSplunkEnterprise": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "networkInterfaceNameSplunkEnterprise": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "machineSettings": {
+ "type": "object"
+ },
+ "subnet3Ref": {
+ "type": "string"
+ },
+ "osSettingsSplunk": {
+ "type": "object"
+ },
+ "tagvalues": {
+ "type": "object",
+ "defaultValue": {
+ "program": "p2p",
+ "project": "TrendMicro"
+ }
+ },
+ "udpPort": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "storageAccountName": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {
+ "publicIpName": "machineSettings",
+ "splunkServerRole": "splunk_server",
+ "singleQuote": "'",
+ "clusterMasterIp": "machineSettings"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[concat(parameters('publicIPAddressSettingsSplunk').name, parameters('publicIPAddressSettingsSplunk').map[copyindex()])]",
+ "copy": {
+ "name": "publicIPAddressLoop",
+ "count": "publicIPAddressSettingsSplunk"
+ },
+ "location": "westus",
+ "tags": {
+ "program": "p2p",
+ "project": "TrendMicro"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[concat(parameters('publicIPAddressSettingsSplunk').domainNamePrefix, parameters('publicIPAddressSettingsSplunk').map[copyindex()])]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "",
+ "location": "westus",
+ "tags": {
+ "program": "p2p",
+ "project": "TrendMicro"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Allow-SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "machineSettings",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Allow-HTTP",
+ "properties": {
+ "description": "Allows HTTP traffic on port 8000",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Allow-HTTPS",
+ "properties": {
+ "description": "Allows HTTPS traffic on port 443",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Allow-HTTP-Event-Collector",
+ "properties": {
+ "description": "Allows HTTP(S) Event Collector traffic on port 8088",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8088",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Allow-Receiver-TCP",
+ "properties": {
+ "description": "Allows receiver TCP traffic on port 9997",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "9997",
+ "sourceAddressPrefix": "machineSettings",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Allow-Mgmt-From-VNET",
+ "properties": {
+ "description": "Allows mgmt on port 8089 from VNET only",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8089",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Allow-Custom-UDP",
+ "properties": {
+ "description": "Allows UDP port entered by user",
+ "protocol": "Udp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "",
+ "location": "westus",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/ parameters('networkSecurityGroupNameSplunkEnterprise')",
+ "Microsoft.Network/publicIPAddresses/machineSettings"
+ ],
+ "tags": {
+ "program": "p2p",
+ "project": "TrendMicro"
+ },
+ "properties": {
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/ parameters('networkSecurityGroupNameSplunkEnterprise')"
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "machineSettings",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/machineSettings"
+ },
+ "subnet": {
+ "id": "subnet3Ref"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "",
+ "location": "westus",
+ "tags": {
+ "program": "p2p",
+ "project": "TrendMicro"
+ },
+ "plan": {
+ "name": "osSettingsSplunk",
+ "publisher": "osSettingsSplunk",
+ "product": "osSettingsSplunk"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/ parameters('networkInterfaceNameSplunkEnterprise')"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/machineSettings"
+ },
+ "hardwareProfile": {
+ "vmSize": "machineSettings"
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "adminPassword": ""
+ },
+ "storageProfile": {
+ "imageReference": "osSettingsSplunk",
+ "osDisk": {
+ "name": "parameters('vmNameSplunkEnterprise')_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk1",
+ "diskSizeGB": "machineSettings",
+ "lun": 0,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk2",
+ "diskSizeGB": "machineSettings",
+ "lun": 1,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk3",
+ "diskSizeGB": "machineSettings",
+ "lun": 2,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk4",
+ "diskSizeGB": "machineSettings",
+ "lun": 3,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk5",
+ "diskSizeGB": "machineSettings",
+ "lun": 4,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk6",
+ "diskSizeGB": "machineSettings",
+ "lun": 5,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk7",
+ "diskSizeGB": "machineSettings",
+ "lun": 6,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "parameters('vmNameSplunkEnterprise')_DataDisk8",
+ "diskSizeGB": "machineSettings",
+ "lun": 7,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/ parameters('networkInterfaceNameSplunkEnterprise')"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('vmNameSplunkEnterprise')/node-setup",
+ "location": "westus",
+ "tags": {
+ "program": "p2p",
+ "project": "TrendMicro"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ parameters('vmNameSplunkEnterprise')",
+ "Microsoft.Network/networkInterfaces/ parameters('networkInterfaceNameSplunkEnterprise')"
+ ],
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "CustomScriptForLinux",
+ "typeHandlerVersion": "1.5",
+ "settings": {
+ "fileUris": "osSettingsSplunk"
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash node-setup.sh -r splunk_server -c machineSettings -u parameters('udpPort') -p ' parameters('splunkAdminPassword')'"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "splunkenterpriseUri": {
+ "type": "string",
+ "value": "[concat('https://',reference(resourceId('Microsoft.Network/publicIPAddresses',parameters('publicIPAddressSettingsSplunk').name)).dnsSettings.fqdn)]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT690 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT690
new file mode 100644
index 0000000..4f21a0c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT690
@@ -0,0 +1,61 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/nsg.json"
+ ],
+ "timestamp": 1642962899124,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/nsg.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT690",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT690",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "nsgName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "securityRules": {
+ "type": "array"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "apiVersion": "2018-06-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "nsgName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "securityRules": "securityRules"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT691 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT691
new file mode 100644
index 0000000..436d692
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT691
@@ -0,0 +1,76 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/publicipaddress.json"
+ ],
+ "timestamp": 1642962899132,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/publicipaddress.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT691",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT691",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicIPAddressName": {
+ "type": "string"
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": "Dynamic"
+ },
+ "dnsNameForPublicIP": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2018-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIPAddressName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNameForPublicIP"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "publicIPAddressName": {
+ "type": "string",
+ "value": "[parameters('publicIPAddressName')]"
+ },
+ "publicIPResourceId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/publicIPAddresses',parameters('publicIPAddressName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT692 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT692
new file mode 100644
index 0000000..d9e04b1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT692
@@ -0,0 +1,67 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/virtualnetworks.json"
+ ],
+ "timestamp": 1642962899140,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ddos-attack-prevention/nested/microsoft.network/virtualnetworks.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT692",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT692",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vnetName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "addressPrefix": {
+ "type": "string"
+ },
+ "subnets": {
+ "type": "array"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2018-06-01",
+ "name": "vnetName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "addressPrefix"
+ ]
+ },
+ "subnets": "subnets"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT693 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT693
new file mode 100644
index 0000000..cc8d422
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT693
@@ -0,0 +1,524 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ddos-attack-prevention/azuredeploy.json",
+ "/demos/ddos-attack-prevention/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899149,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ddos-attack-prevention/azuredeploy.json",
+ "/demos/ddos-attack-prevention/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT693",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.insights/alertrules",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT693",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/ddos-attack-prevention/",
+ "metadata": {
+ "description": "this will be the location for artifacts"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "this will be the sas key to access artifacts"
+ }
+ },
+ "location": {
+ "type": "string",
+ "allowedValues": [
+ "East US",
+ "West Europe",
+ "Southeast Asia",
+ "Australia Southeast"
+ ],
+ "metadata": {
+ "description": "your resources will be created in this location"
+ },
+ "value": "East US"
+ },
+ "omsSku": {
+ "type": "string",
+ "defaultValue": "PerNode",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode"
+ ],
+ "metadata": {
+ "description": "this will be you SKU for OMS"
+ }
+ },
+ "vNetName": {
+ "type": "string",
+ "defaultValue": "ddos-attack-vnet",
+ "metadata": {
+ "description": "this will be name of the VNET"
+ }
+ },
+ "vNetAddressSpace": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/16",
+ "metadata": {
+ "description": "this will be address space for VNET"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "subnet-01",
+ "metadata": {
+ "description": "this will be name of the subnet"
+ }
+ },
+ "subnetAddressSpace": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/24",
+ "metadata": {
+ "description": "this will be address space for subnet"
+ }
+ },
+ "nsgNamePrefix": {
+ "type": "string",
+ "defaultValue": "ddos-attack",
+ "metadata": {
+ "description": "this will be prefix used for NSG"
+ }
+ },
+ "pipAddressType": {
+ "type": "string",
+ "defaultValue": "dynamic",
+ "allowedValues": [
+ "dynamic",
+ "static"
+ ],
+ "metadata": {
+ "description": "this will be the type of public IP address used for the VM name"
+ }
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "vm",
+ "metadata": {
+ "description": "this will be the prefix used for the VM name"
+ }
+ },
+ "adminUserName": {
+ "type": "string",
+ "metadata": {
+ "description": "this will be the user name of the VMs deployed"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUserPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "this will be the password of the user created on the user"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "emailToSendAlertsTo": {
+ "type": "string",
+ "defaultValue": "dummy@contoso.com",
+ "metadata": {
+ "description": "attack email alerts will be sent to this email id"
+ }
+ }
+ },
+ "variables": {
+ "omsWorkspaceName": "[concat('DDOS-Attack','-',uniqueString(resourceGroup().id))]",
+ "omsSolutions": [
+ "Security",
+ "AzureActivity",
+ "AntiMalware"
+ ],
+ "tags": {
+ "scenario": "Vm-DDOS-Attack-Prevention"
+ },
+ "subnets": [
+ {
+ "name": "subnet-01",
+ "properties": {
+ "addressPrefix": "10.1.0.0/24"
+ }
+ }
+ ],
+ "nsgName": "ddos-attack-nsg",
+ "nsgSecurityRules": [
+ {
+ "name": "allow-inbound-http",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-inbound-rdp",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 2000,
+ "direction": "Inbound"
+ }
+ }
+ ],
+ "vmName": "vm-with-ddos",
+ "omsTemplateUri": "[concat(uri(parameters('_artifactsLocation'),'nested/microsoft.loganalytics/workspaces.json'),parameters('_artifactsLocationSasToken'))]",
+ "vnetTemplateUri": "[concat(uri(parameters('_artifactsLocation'),'nested/microsoft.network/virtualnetworks.json'),parameters('_artifactsLocationSasToken'))]",
+ "nsgTemplateUri": "[concat(uri(parameters('_artifactsLocation'),'nested/microsoft.network/nsg.json'),parameters('_artifactsLocationSasToken'))]",
+ "pipTemplateUri": "[concat(uri(parameters('_artifactsLocation'),'nested/microsoft.network/publicipaddress.json'),parameters('_artifactsLocationSasToken'))]",
+ "nicTemplateUri": "[concat(uri(parameters('_artifactsLocation'),'nested/microsoft.network/nic-with-pip.json'),parameters('_artifactsLocationSasToken'))]",
+ "vmTemplateUri": "[concat(uri(parameters('_artifactsLocation'),'nested/microsoft.compute/vm.windows.json'),parameters('_artifactsLocationSasToken'))]",
+ "dscScriptUri": "[concat(uri(parameters('_artifactsLocation'),'DSC/DesiredStateConfig.ps1.zip'),parameters('_artifactsLocationSasToken'))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2018-05-01",
+ "name": "deploy-ddos-attack-oms-resource",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('omsTemplateUri')]"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "[variables('omsWorkspaceName')]"
+ },
+ "omsSolutionsName": {
+ "value": [
+ "Security",
+ "AzureActivity",
+ "AntiMalware"
+ ]
+ },
+ "sku": {
+ "value": "PerNode"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "tags": {
+ "value": {
+ "scenario": "Vm-DDOS-Attack-Prevention"
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-05-01",
+ "name": "vnetName--resource",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('vnetTemplateUri')]"
+ },
+ "parameters": {
+ "vnetName": {
+ "value": "vnetName"
+ },
+ "addressPrefix": {
+ "value": "10.1.0.0/16"
+ },
+ "subnets": {
+ "value": [
+ {
+ "name": "subnet-01",
+ "properties": {
+ "addressPrefix": "10.1.0.0/24"
+ }
+ }
+ ]
+ },
+ "location": {
+ "value": "East US"
+ },
+ "tags": {
+ "value": {
+ "scenario": "Vm-DDOS-Attack-Prevention"
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-05-01",
+ "name": "ddos-attack-nsg--resource",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('nsgTemplateUri')]"
+ },
+ "parameters": {
+ "nsgName": {
+ "value": "ddos-attack-nsg"
+ },
+ "securityRules": {
+ "value": [
+ {
+ "name": "allow-inbound-http",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-inbound-rdp",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 2000,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ },
+ "location": {
+ "value": "East US"
+ },
+ "tags": {
+ "value": {
+ "scenario": "Vm-DDOS-Attack-Prevention"
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-05-01",
+ "name": "vm-with-ddos-pip-resource",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('pipTemplateUri')]"
+ },
+ "parameters": {
+ "publicIPAddressName": {
+ "value": "vm-with-ddos-pip"
+ },
+ "publicIPAddressType": {
+ "value": "dynamic"
+ },
+ "dnsNameForPublicIP": {
+ "value": "[concat(variables('vmName'),uniqueString(resourceGroup().id, 'pip'),'-pip')]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "tags": {
+ "value": {
+ "scenario": "Vm-DDOS-Attack-Prevention"
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-05-01",
+ "name": "vm-with-ddos-nic-resource",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "vm-with-ddos-pip-resource",
+ "ddos-attack-nsg--resource",
+ "vnetName--resource"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('nicTemplateUri')]"
+ },
+ "parameters": {
+ "nicName": {
+ "value": "vm-with-ddos-nic"
+ },
+ "publicIPAddressId": {
+ "value": "Microsoft.Network/publicIPAddresses/vm-with-ddos-pip"
+ },
+ "subnetId": {
+ "value": "[resourceId('Microsoft.Network/virtualNetworks/subnets',parameters('vnetName'), variables('subnets')[0].name)]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "nsgId": {
+ "value": "Microsoft.Network/networkSecurityGroups/ddos-attack-nsg"
+ },
+ "tags": {
+ "value": {
+ "scenario": "Vm-DDOS-Attack-Prevention"
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-05-01",
+ "name": "deploy-vm-with-ddos-resource",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "vm-with-ddos-nic-resource"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('vmTemplateUri')]"
+ },
+ "parameters": {
+ "vmName": {
+ "value": "vm-with-ddos"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "nicId": {
+ "value": "Microsoft.Network/networkInterfaces/vm-with-ddos-nic"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "tags": {
+ "value": {
+ "scenario": "Vm-DDOS-Attack-Prevention"
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vm-with-ddos/OMSExtension",
+ "apiVersion": "2018-06-01",
+ "location": "East US",
+ "dependsOn": [
+ "deploy-vm-with-ddos-resource",
+ "deploy-ddos-attack-oms-resource"
+ ],
+ "properties": {
+ "publisher": "Microsoft.EnterpriseCloud.Monitoring",
+ "type": "MicrosoftMonitoringAgent",
+ "typeHandlerVersion": "1.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "workspaceId": "[reference('deploy-ddos-attack-oms-resource').outputs.workspaceId.value]"
+ },
+ "protectedSettings": {
+ "workspaceKey": "[reference('deploy-ddos-attack-oms-resource').outputs.workspaceKey.value]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vm-with-ddos/DSCExtension",
+ "apiVersion": "2018-06-01",
+ "location": "East US",
+ "dependsOn": [
+ "deploy-vm-with-ddos-resource",
+ "deploy-ddos-attack-oms-resource"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "configuration": {
+ "url": "[variables('dscScriptUri')]",
+ "script": "DesiredStateConfig.ps1",
+ "function": "Main"
+ },
+ "configurationArguments": {
+ "MachineName": "vm-with-ddos"
+ }
+ },
+ "protectedSettings": {}
+ }
+ },
+ {
+ "type": "microsoft.insights/alertrules",
+ "name": "DDoS-attack-metric-alert-rule",
+ "apiVersion": "2016-03-01",
+ "location": "East US",
+ "dependsOn": [
+ "vm-with-ddos-pip-resource"
+ ],
+ "properties": {
+ "name": "DDoS attack alert",
+ "description": "Under DDoS attack alert",
+ "isEnabled": true,
+ "condition": {
+ "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
+ "dataSource": {
+ "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
+ "resourceUri": "[reference(concat(variables('vmName'),'-pip','-resource')).outputs.publicIPResourceId.value]",
+ "metricNamespace": null,
+ "metricName": "IfUnderDDoSAttack"
+ },
+ "operator": "GreaterThanOrEqual",
+ "threshold": 1,
+ "windowSize": "PT5M"
+ },
+ "actions": [
+ {
+ "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
+ "sendToServiceOwners": true,
+ "customEmails": [
+ "dummy@contoso.com"
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT694 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT694
new file mode 100644
index 0000000..8a86ac5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT694
@@ -0,0 +1,316 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/devtest-p2s-iis/azuredeploy.json",
+ "/demos/devtest-p2s-iis/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899163,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/devtest-p2s-iis/azuredeploy.json",
+ "/demos/devtest-p2s-iis/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT694",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.network/virtualnetworkgateways",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT694",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "environmentPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Prefix to use for most of the resources."
+ },
+ "defaultValue": "DevTest",
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "size of vm."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "vpnClientAddressPoolPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "The IP address range from which VPN clients will receive an IP address when connected. Range specified must not overlap with on-premise network."
+ },
+ "defaultValue": "10.10.8.0/24",
+ "value": "10.10.8.0/24"
+ },
+ "clientRootCertName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the client root certificate used to authenticate VPN clients. This is a common name used to identify the root cert."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "clientRootCertData": {
+ "type": "string",
+ "metadata": {
+ "description": "Client root certificate data used to authenticate VPN clients."
+ },
+ "value": "MIIC9jCCAeKgAwIBAgIQ6vuFtl5UuqBIU6v+063S7jAJBgUrDgMCHQUAMBUxEzARBgNVBAMTClAyU1ZQTlJvb3QwHhcNMTYwNDA4MTkxNzIxWhcNMzkxMjMxMjM1OTU5WjAVMRMwEQYDVQQDEwpQMlNWUE5Sb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxgLWfOWw3gaj8wBne6llVsjKAUPw41aBjm5gwnhB2fwRh1LiJ5784JgsL2Mz+syz9f2zDGBYv1tXFiN5T//fpl3NOG5iWXTpYiJsy2hScOdOAoCUDGJNnAEyRZgwLQeosHBrSexDF+40q2vhe56pcdQAeXr+wjUamogTV9a6PDV2MIm6H+D1wGRhJ6WylltOQTQayqfa/YJ42z791t2t+SI8kfmApuyWU4BsAPyFk2qPIVZhe0PTB2S88LI+pIwqZsHLlm4MKZ4UsYxFHUAsecwG6r0ZwrxUqU5JDtHDAUdZcR4LCqtKoKhRrfk4mFPsgdLf7xv4hKzytfoAQ0EF0wIDAQABo0owSDBGBgNVHQEEPzA9gBCEzXExm3SI08M1qgJ5myW+oRcwFTETMBEGA1UEAxMKUDJTVlBOUm9vdIIQ6vuFtl5UuqBIU6v+063S7jAJBgUrDgMCHQUAA4IBAQBHpGJDm70KYk+BJakeUCKZmt9yqN8y5PQnBVxQUPhiXHIsOjf3+Rv8wihtjWC3kUjmRBdyVVvrXjZXH/wsWDaLjOLvcb2kP4RvVVIkUxudtVABrYj2yCZkO1bP1jDigF4dDJFg5klJlDXlVmZS/RdkG2H58ZhA2gQ11j5+oCWeiEjN5tpG1ze81ogCXiQrZ3+RUVgewmzAV/Ax4P+Q2K9/iw66z4RAfjsJ58/bUgemX8SssqLLVH+CtBPd8aYdrkHqBVkuFnxEie3uyPhNAdqFe5XlIEZXIqOt8f7Mwhq90QvEyDGmGhe8byhBrGrP3ZApufSyewVNq8XGwIsz1lE4"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "newStorageAccount": "[concat(uniqueString(resourceGroup().id),'store')]",
+ "storageAccountType": "Standard_LRS",
+ "vnetName": "GEN-UNIQUE-8Vnet",
+ "vnetAddressPrefix": "10.0.0.0/23",
+ "gatewaySubnetPrefix": "10.0.1.0/24",
+ "gatewayPublicIPName": "GEN-UNIQUE-8GatewayPIP",
+ "gatewayName": "GEN-UNIQUE-8Gateway",
+ "gatewaySku": "Basic",
+ "gatewaySubnetRef": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8Vnet/GatewaySubnet",
+ "appSubnetName": "appSubnet",
+ "appSubnetPrefix": "10.0.0.0/24",
+ "appSubnetRef": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8Vnet/appSubnet",
+ "nicName": "GEN-UNIQUE-8NIC01",
+ "vmName": "GEN-UNIQUE-8VM01",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "imageSKU": "2019-Datacenter",
+ "vmExtensionName": "dscExtension",
+ "modulesUrl": "[uri(parameters('_artifactsLocation'), concat('DevTestWebsite.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "configurationFunction": "DevTestWebsite.ps1\\DevTestWebsite"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('newStorageAccount')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-8GatewayPIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE-8Vnet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/23"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24"
+ }
+ },
+ {
+ "name": "appSubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE-8NIC01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-8Vnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8Vnet/appSubnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GEN-UNIQUE-8VM01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('newStorageAccount'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE-8VM01",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE-8VM01_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-8NIC01"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-8VM01/dscExtension",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE-8VM01"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), concat('DevTestWebsite.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "DevTestWebsite.ps1\\DevTestWebsite",
+ "Properties": {
+ "MachineName": "GEN-UNIQUE-8VM01"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworkGateways",
+ "name": "GEN-UNIQUE-8Gateway",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//GEN-UNIQUE-8GatewayPIP",
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-8Vnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8Vnet/GatewaySubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-8GatewayPIP"
+ }
+ },
+ "name": "vnetGatewayConfig"
+ }
+ ],
+ "sku": {
+ "name": "Basic",
+ "tier": "Basic"
+ },
+ "gatewayType": "Vpn",
+ "vpnType": "RouteBased",
+ "enableBgp": "false",
+ "vpnClientConfiguration": {
+ "vpnClientAddressPool": {
+ "addressPrefixes": [
+ "10.10.8.0/24"
+ ]
+ },
+ "vpnClientRootCertificates": [
+ {
+ "name": "GEN-UNIQUE-8",
+ "properties": {
+ "PublicCertData": "MIIC9jCCAeKgAwIBAgIQ6vuFtl5UuqBIU6v+063S7jAJBgUrDgMCHQUAMBUxEzARBgNVBAMTClAyU1ZQTlJvb3QwHhcNMTYwNDA4MTkxNzIxWhcNMzkxMjMxMjM1OTU5WjAVMRMwEQYDVQQDEwpQMlNWUE5Sb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxgLWfOWw3gaj8wBne6llVsjKAUPw41aBjm5gwnhB2fwRh1LiJ5784JgsL2Mz+syz9f2zDGBYv1tXFiN5T//fpl3NOG5iWXTpYiJsy2hScOdOAoCUDGJNnAEyRZgwLQeosHBrSexDF+40q2vhe56pcdQAeXr+wjUamogTV9a6PDV2MIm6H+D1wGRhJ6WylltOQTQayqfa/YJ42z791t2t+SI8kfmApuyWU4BsAPyFk2qPIVZhe0PTB2S88LI+pIwqZsHLlm4MKZ4UsYxFHUAsecwG6r0ZwrxUqU5JDtHDAUdZcR4LCqtKoKhRrfk4mFPsgdLf7xv4hKzytfoAQ0EF0wIDAQABo0owSDBGBgNVHQEEPzA9gBCEzXExm3SI08M1qgJ5myW+oRcwFTETMBEGA1UEAxMKUDJTVlBOUm9vdIIQ6vuFtl5UuqBIU6v+063S7jAJBgUrDgMCHQUAA4IBAQBHpGJDm70KYk+BJakeUCKZmt9yqN8y5PQnBVxQUPhiXHIsOjf3+Rv8wihtjWC3kUjmRBdyVVvrXjZXH/wsWDaLjOLvcb2kP4RvVVIkUxudtVABrYj2yCZkO1bP1jDigF4dDJFg5klJlDXlVmZS/RdkG2H58ZhA2gQ11j5+oCWeiEjN5tpG1ze81ogCXiQrZ3+RUVgewmzAV/Ax4P+Q2K9/iw66z4RAfjsJ58/bUgemX8SssqLLVH+CtBPd8aYdrkHqBVkuFnxEie3uyPhNAdqFe5XlIEZXIqOt8f7Mwhq90QvEyDGmGhe8byhBrGrP3ZApufSyewVNq8XGwIsz1lE4"
+ }
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT695 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT695
new file mode 100644
index 0000000..e67c32f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT695
@@ -0,0 +1,325 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/diskraid-ubuntu-vm/azuredeploy.json",
+ "/demos/diskraid-ubuntu-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899171,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/diskraid-ubuntu-vm/azuredeploy.json",
+ "/demos/diskraid-ubuntu-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT695",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT695",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username used when provisioning a virtual machines"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique namespace for the Storage Account where the Virtual Machine's disks will be placed"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "myVNET",
+ "metadata": {
+ "description": "Virtual Network"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "metadata": {
+ "description": "Size of the virtual machine"
+ }
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Address space for the VNET"
+ }
+ },
+ "subnet1Name": {
+ "type": "string",
+ "defaultValue": "Data",
+ "metadata": {
+ "description": "Subnet name for the VNET that resources will be provisioned in to"
+ }
+ },
+ "subnet1Prefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Address space for the subnet"
+ }
+ },
+ "dnsName": {
+ "type": "string",
+ "metadata": {
+ "description": "Load balancer subdomain name: for example (.westus.cloudapp.azure.com)"
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "dataDiskSize": {
+ "type": "int",
+ "defaultValue": 20,
+ "metadata": {
+ "description": "Size of each data disk attached to data nodes in (Gb)"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "subnet1Ref": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8/Data",
+ "scriptUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/shared_scripts/ubuntu/vm-disk-utils-0.1.sh",
+ "securityGroupName": "diskraidnsg",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE-8/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "diskraidnsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Data",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIp",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-13"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-8",
+ "Microsoft.Network/publicIPAddresses//publicIP",
+ "Microsoft.Network/networkSecurityGroups//diskraidnsg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE-8/Data"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/diskraidnsg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "myvm",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nic",
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "myvm",
+ "adminUsername": "GEN-UNIQUE-8",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "myvm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "myvm_DataDisk1",
+ "diskSizeGB": 20,
+ "lun": 0,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "myvm_DataDisk2",
+ "diskSizeGB": 20,
+ "lun": 1,
+ "caching": "None",
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nic"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "myvm/azureVmUtils",
+ "apiVersion": "2015-06-15",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//myvm"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/shared_scripts/ubuntu/vm-disk-utils-0.1.sh"
+ ],
+ "commandToExecute": "bash vm-disk-utils-0.1.sh -s"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT696 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT696
new file mode 100644
index 0000000..978bcbd
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT696
@@ -0,0 +1,525 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dmz-nsg/azuredeploy.json",
+ "/demos/dmz-nsg/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899179,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dmz-nsg/azuredeploy.json",
+ "/demos/dmz-nsg/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT696",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT696",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Username for the Virtual Machines."
+ },
+ "value": "TheAdmin"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Virtual Machines."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "description"
+ },
+ "defaultValue": "Standard_D4_v3"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "NSGName": "myVNetNSG",
+ "VM01Name": "IIS01",
+ "VM02Name": "AppVM01",
+ "VM03Name": "AppVM02",
+ "VM04Name": "DNS01",
+ "VNetName": "VNet01",
+ "Subnet1Name": "FrontEnd",
+ "Subnet1Prefix": "10.0.1.0/24",
+ "Subnet2Name": "BackEnd",
+ "Subnet2Prefix": "10.0.2.0/24",
+ "NIC01SubnetRef": "Microsoft.Network/virtualNetworks/subnets/VNet01/FrontEnd",
+ "NIC02SubnetRef": "Microsoft.Network/virtualNetworks/subnets/VNet01/BackEnd",
+ "NIC03SubnetRef": "Microsoft.Network/virtualNetworks/subnets/VNet01/BackEnd",
+ "NIC04SubnetRef": "Microsoft.Network/virtualNetworks/subnets/VNet01/BackEnd",
+ "imageOffer": "WindowsServer",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "windowsOSVersion": "2019-Datacenter"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "VNet01",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "VNet01"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups//myVNetNSG",
+ "Microsoft.Network/publicIPAddresses//IIS01_NIC_PIP"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.1.0/24",
+ "10.0.2.0/24"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "FrontEnd",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/myVNetNSG"
+ }
+ }
+ },
+ {
+ "name": "BackEnd",
+ "properties": {
+ "addressPrefix": "10.0.2.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/myVNetNSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "IIS01_NIC_PIP",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "IIS01 NIC PIP"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "idleTimeoutInMinutes": 4
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "IIS01_NIC",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "IIS01 NIC"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//VNet01"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.1.5",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/IIS01_NIC_PIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNet01/FrontEnd"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "AppVM01_NIC",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "AppVM01 NIC"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//VNet01"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.2.5",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNet01/BackEnd"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "AppVM02_NIC",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "AppVM02 NIC"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//VNet01"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.2.6",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNet01/BackEnd"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "DNS01_NIC",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "DNS01 NIC"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//VNet01"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.2.4",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNet01/BackEnd"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "IIS01",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "IIS01"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//IIS01_NIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "computerName": "IIS01",
+ "adminUsername": "TheAdmin",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "properties": {
+ "primary": true
+ },
+ "id": "Microsoft.Network/networkInterfaces/IIS01_NIC"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "AppVM01",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "AppVM01"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//AppVM01_NIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "computerName": "AppVM01",
+ "adminUsername": "TheAdmin",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "properties": {
+ "primary": true
+ },
+ "id": "Microsoft.Network/networkInterfaces/AppVM01_NIC"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "AppVM02",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "AppVM02"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//AppVM02_NIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "computerName": "AppVM02",
+ "adminUsername": "TheAdmin",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "properties": {
+ "primary": true
+ },
+ "id": "Microsoft.Network/networkInterfaces/AppVM02_NIC"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "DNS01",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "DNS01"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//DNS01_NIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "computerName": "DNS01",
+ "adminUsername": "TheAdmin",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "properties": {
+ "primary": true
+ },
+ "id": "Microsoft.Network/networkInterfaces/DNS01_NIC"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "myVNetNSG",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "myVNetNSG"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "enable_dns_rule",
+ "properties": {
+ "description": "Enable Internal DNS",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "53",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "10.0.2.4",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "enable_rdp_rule",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "enable_web_rule",
+ "properties": {
+ "description": "Enable Internet to [variables('VM01Name')]",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "10.0.1.5",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "enable_app_rule",
+ "properties": {
+ "description": "Enable [variables('VM01Name')] to [variables('VM02Name')]",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "10.0.1.5",
+ "destinationAddressPrefix": "10.0.2.5",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "deny_internet_rule",
+ "properties": {
+ "description": "Isolate the [variables('VNetName')] VNet from the Internet",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Deny",
+ "priority": 140,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "deny_frontend_rule",
+ "properties": {
+ "description": "Isolate the [variables('Subnet1Name')] subnet from the [variables('Subnet2Name')] subnet",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "10.0.1.0/24",
+ "destinationAddressPrefix": "10.0.2.0/24",
+ "access": "Deny",
+ "priority": 150,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT697 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT697
new file mode 100644
index 0000000..16a4370
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT697
@@ -0,0 +1,331 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dns-forwarder/azuredeploy.json",
+ "/demos/dns-forwarder/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899188,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dns-forwarder/azuredeploy.json",
+ "/demos/dns-forwarder/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT697",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT697",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "type": "string",
+ "defaultValue": "dnsproxy",
+ "metadata": {
+ "description": "Name of the Virtual Machine."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the storage account for diagnostics. Storage account names must be globally unique."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "forwardIP": {
+ "type": "string",
+ "defaultValue": "168.63.129.16",
+ "metadata": {
+ "description": "This is the IP address to forward DNS queries to. The default value represents Azure's internal DNS recursive resolvers."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Virtual machine size"
+ },
+ "defaultValue": "Standard_A1_v2"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templatelink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located."
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ }
+ },
+ "variables": {
+ "ubuntuOSVersion": "18.04-LTS",
+ "asetName": "dnsproxy-avail",
+ "nsgName": "dnsproxy-nsg",
+ "vnetName": "dnsproxy-vnet",
+ "vnetAddressPrefix": "10.0.0.0/8",
+ "subNet1Name": "subnet1",
+ "subNet1Prefix": "10.1.0.0/16",
+ "storType": "Standard_LRS",
+ "location": "[resourceGroup().location]",
+ "nicName": "dnsproxy-nic",
+ "pipName": "dnsproxy-pip",
+ "scriptUrl": "[uri(parameters('_artifactsLocation'), concat('forwarderSetup.sh', parameters('_artifactsLocationSasToken')))]",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/StorageAccounts",
+ "comments": "Storage account for the VHD files for the VMs",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2019-06-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "comments": "availability set for creating a HA cluster, run the template multiple times to get multiple DNS servers",
+ "name": "dnsproxy-avail",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "comments": "An NSG to prevent inbound traffic other than SSH, set sourceAddressPrefix to restrict access further or block all together (or remove the public ip) and ssh in from another vm",
+ "name": "dnsproxy-nsg",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "allow_ssh_in",
+ "properties": {
+ "description": "The only thing allowed is SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "comments": "An example virtual network, for real scenarios add the DNS forwarder to your own vnet",
+ "name": "dnsproxy-vnet",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/8"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnet1Name",
+ "properties": {
+ "addressPrefix": "10.1.0.0/16"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "comments": "A public IP to allow us to SSH into the VM, not recommended for production DNS servers",
+ "name": "dnsproxy-pip",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "comments": "A single network interface on each DNS server",
+ "name": "dnsproxy-nic",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//dnsproxy-pip",
+ "Microsoft.Network/virtualNetworks//dnsproxy-vnet",
+ "Microsoft.Network/networkSecurityGroups//dnsproxy-nsg"
+ ],
+ "properties": {
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/dnsproxy-nsg"
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dnsproxy-pip"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/dnsproxy-vnet/subnet1Name"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "comments": "A stock Ubuntu server, a VM extension will add the DNS server to it later",
+ "name": "dnsproxy",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//dnsproxy-nic",
+ "Microsoft.Storage/StorageAccounts//GEN-UNIQUE",
+ "Microsoft.Compute/availabilitySets//dnsproxy-avail"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/dnsproxy-avail"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A1_v2"
+ },
+ "osProfile": {
+ "computerName": "dnsproxy",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dnsproxy-nic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', toLower(parameters('storageAccountName')))).primaryEndpoints.blob]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "comments": "The shell script to install Bind9 and setup the ACL and forwarders. If this step fails, check the logs in /var/log/waagent.log and /var/log/azure/* for details",
+ "name": "dnsproxy/setupdnsfirewall",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//dnsproxy"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('forwarderSetup.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh forwarderSetup.sh 168.63.129.16 10.0.0.0/8"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT698 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT698
new file mode 100644
index 0000000..3e4eab9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT698
@@ -0,0 +1,160 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dns-records-office365/azuredeploy.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899196,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dns-records-office365/azuredeploy.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT698",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.network/dnszones"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT698",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "dnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the DNS Zone to create or update."
+ },
+ "value": "contoso.local"
+ },
+ "ttl": {
+ "type": "int",
+ "defaultValue": 3600,
+ "metadata": {
+ "description": "Time to live value, in seconds"
+ },
+ "value": 3600
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located."
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "recordTypes": {
+ "type": "array",
+ "defaultValue": [
+ "mail",
+ "mdm",
+ "sfb"
+ ],
+ "metadata": {
+ "description": "A delimited list that defines the resources to create, acceptable values are (mail,mdm, and sfb). A combination of all or just one of the values can be used."
+ },
+ "value": [
+ "mail",
+ "mdm",
+ "sfb"
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2018-05-01",
+ "type": "Microsoft.Network/dnszones",
+ "name": "contoso.local",
+ "location": "global"
+ },
+ {
+ "name": "[concat('SettingUpDNSRecods','-',parameters('recordTypes')[copyIndex()])]",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "Microsoft.Network/dnszones/contoso.local"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(parameters('recordTypes')[copyIndex()],'.json',parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "dnsZoneName": {
+ "value": "contoso.local"
+ },
+ "ttl": {
+ "value": 3600
+ }
+ }
+ }
+ },
+ {
+ "name": "[concat('SettingUpDNSRecods','-',parameters('recordTypes')[copyIndex()])]",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "Microsoft.Network/dnszones/contoso.local"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(parameters('recordTypes')[copyIndex()],'.json',parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "dnsZoneName": {
+ "value": "contoso.local"
+ },
+ "ttl": {
+ "value": 3600
+ }
+ }
+ }
+ },
+ {
+ "name": "[concat('SettingUpDNSRecods','-',parameters('recordTypes')[copyIndex()])]",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "Microsoft.Network/dnszones/contoso.local"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(parameters('recordTypes')[copyIndex()],'.json',parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "dnsZoneName": {
+ "value": "contoso.local"
+ },
+ "ttl": {
+ "value": 3600
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT699 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT699
new file mode 100644
index 0000000..8e31db7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT699
@@ -0,0 +1,120 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dns-records-office365/mail.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899204,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dns-records-office365/mail.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT699",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/dnszones/cname",
+ "microsoft.network/dnszones/mx",
+ "microsoft.network/dnszones/txt"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT699",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "dnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the DNS Zone."
+ },
+ "value": "contoso.local"
+ },
+ "ttl": {
+ "type": "int",
+ "defaultValue": "3600",
+ "metadata": {
+ "description": "Time to live value, in seconds."
+ },
+ "value": 3600
+ },
+ "recordTypes": {
+ "value": [
+ "mail",
+ "mdm",
+ "sfb"
+ ]
+ }
+ },
+ "variables": {
+ "mx": "[concat(replace(parameters('dnsZoneName'),'.','-'),'.mail.protection.outlook.com')]"
+ },
+ "resources": [
+ {
+ "comments": "CNAME record needed for autodiscover endpoint for making it easier to configure Outlook.",
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/autodiscover",
+ "apiVersion": "2018-05-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "autodiscover.outlook.com"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/msoid",
+ "apiVersion": "2018-05-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "clientconfig.microsoftonline-p.net"
+ }
+ }
+ },
+ {
+ "comments": "MX record so email for your domain will be routed to Office 365",
+ "type": "Microsoft.Network/dnszones/MX",
+ "name": "contoso.local/@",
+ "apiVersion": "2016-04-01",
+ "properties": {
+ "TTL": 3600,
+ "MXRecords": [
+ {
+ "exchange": "[variables('mx')]",
+ "preference": 0
+ }
+ ]
+ }
+ },
+ {
+ "comments": "TXT record for Sender policy framework (SPF) records, which are used to prevent spam.",
+ "type": "Microsoft.Network/dnszones/TXT",
+ "name": "contoso.local/@",
+ "apiVersion": "2016-04-01",
+ "properties": {
+ "TTL": "TTL",
+ "TXTRecords": [
+ {
+ "value": [
+ "v=spf1 include:spf.protection.outlook.com -all"
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT7 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT7
new file mode 100644
index 0000000..26e6da7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT7
@@ -0,0 +1,99 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/nestedtemplates/vnet-with-dns-server.json"
+ ],
+ "timestamp": 1642962883318,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/nestedtemplates/vnet-with-dns-server.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT7",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT7",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "Description": "The name of the Virtual Network to Create"
+ }
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string",
+ "metadata": {
+ "Description": "The address range of the new VNET in CIDR format"
+ },
+ "defaultValue": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "type": "string",
+ "metadata": {
+ "Description": "The name of the subnet created in the new VNET"
+ }
+ },
+ "subnetRange": {
+ "type": "string",
+ "metadata": {
+ "Description": "The address range of the subnet created in the new VNET"
+ },
+ "defaultValue": "10.0.0.0/24"
+ },
+ "DNSServerAddress": {
+ "type": "array",
+ "metadata": {
+ "Description": "The DNS address(es) of the DNS Server(s) used by the VNET"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "virtualNetworkName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "apiVersion": "2020-03-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "dhcpOptions": {
+ "dnsServers": "DNSServerAddress"
+ },
+ "subnets": [
+ {
+ "name": "subnetName",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT70 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT70
new file mode 100644
index 0000000..1c63bba
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT70
@@ -0,0 +1,490 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-trenddsm.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962884825,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-trenddsm.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT70",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.resources/deployments",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT70",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmStorageAccountContainerName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "network-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "compute-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tagvalues": {
+ "type": "object",
+ "defaultValue": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "publicIPAddressNameTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publicIPDomainNameLabelTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "nicNameTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "dsmvnet"
+ },
+ "subnet1Ref": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "securityGroupNameTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "managerPortTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "heartbeatPortTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmNameTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "publisherTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "offerChoosedTrendDSM": {
+ "type": "object",
+ "defaultValue": ""
+ },
+ "vmAdminNameTrendDSM": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "vmAdminPasswordOrPublicKeyTrendDSM": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "deployment-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "baseUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URL for dependent assets",
+ "artifactsBaseUrl": ""
+ },
+ "defaultValue": "https://deepsecurityazure.blob.core.windows.net/dsmtemplate"
+ },
+ "dsmAdminName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "dsmAdminPassword": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "databaseOption": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "newsqlServerName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "existingSQLServerName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "dbAdminName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "dbAdminPassword": {
+ "type": "securestring",
+ "defaultValue": ""
+ },
+ "dbName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {
+ "licenseMode": "10",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/ parameters('vmAdminNameTrendDSM')/.ssh/authorized_keys",
+ "keyData": ""
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "trendmicroTags"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "",
+ "dnsSettings": {
+ "domainNameLabel": ""
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "trendmicroTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/ parameters('publicIPAddressNameTrendDSM')",
+ "Microsoft.Network/networkSecurityGroups/ parameters('securityGroupNameTrendDSM')"
+ ],
+ "properties": {
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/ parameters('securityGroupNameTrendDSM')"
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/parameters('publicIPAddressNameTrendDSM')"
+ },
+ "subnet": {
+ "id": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "trendmicroTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "allow-inbound-ssh",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-inbound-dsmportal",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-inbound-dsmagent",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4118",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1200,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-inbound-dsmheartbeat",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1300,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-inbound-dsmdownload",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4122",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1400,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-inbound-dsmwebinstaller",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1500,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "trendmicroTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/ parameters('nicNameTrendDSM')",
+ "Microsoft.Resources/deployments/buildSQLServer"
+ ],
+ "plan": {
+ "publisher": "",
+ "product": null,
+ "name": null
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": null
+ },
+ "osProfile": {
+ "computerName": "",
+ "adminUsername": "",
+ "adminPassword": "",
+ "customData": "[base64(concat('vmName:',base64(parameters('vmNameTrendDSM')),',databaseServer:',reference('buildSQLServer').outputs.sqlServerFQDN.value,',databaseName:',base64(parameters('dbName')),',location:',parameters('location'),',managerPort:',parameters('managerPortTrendDSM'),',heartbeatPort:',parameters('heartbeatPortTrendDSM'),',vmFQDN:',reference(resourceId('Microsoft.Network/publicIPAddresses',parameters('publicIPAddressNameTrendDSM')),'2015-06-15').dnsSettings.fqdn,',publicIP:,adminUsername:',base64(parameters('dsmAdminName')),',adminPassword:',base64(parameters('dsmAdminPassword')),',databaseUserName:',base64(parameters('dbAdminName')),',databaseUserPassword:',base64(parameters('dbAdminPassword')),',subscriptionId:',subscription().subscriptionId,',databaseOption:',parameters('databaseOption'),',vmSize:',parameters('offerChoosedTrendDSM').vmSize,',licenseMode:',variables('licenseMode')))]",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "",
+ "offer": null,
+ "sku": null,
+ "version": "2.0.0"
+ },
+ "osDisk": {
+ "name": "parameters('vmNameTrendDSM')-osDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/parameters('nicNameTrendDSM')"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "https://parameters('storageAccountName').blob.core.windows.net/"
+ }
+ }
+ }
+ },
+ {
+ "name": "buildSQLServer",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://deepsecurityazure.blob.core.windows.net/dsmtemplate/nested/database-parameters('databaseOption').json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "westus"
+ },
+ "newsqlServerName": {
+ "value": ""
+ },
+ "existingSQLServerName": {
+ "value": ""
+ },
+ "dbAdminName": {
+ "value": ""
+ },
+ "dbAdminPassword": {
+ "value": ""
+ },
+ "sqlDBName": {
+ "value": ""
+ },
+ "datameerTags": {
+ "value": "datameerTags"
+ },
+ "trendmicroTags": {
+ "value": "trendmicroTags"
+ },
+ "chefSoftwareTags": {
+ "value": "chefSoftwareTags"
+ },
+ "quickstartTags": {
+ "value": "quickstartTags"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "trendmicrodsmUri": {
+ "type": "string",
+ "value": "[concat('https://',reference(resourceId('Microsoft.Network/publicIPAddresses',parameters('publicIPAddressNameTrendDSM'))).dnsSettings.fqdn)]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT700 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT700
new file mode 100644
index 0000000..e5e43c3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT700
@@ -0,0 +1,84 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dns-records-office365/mdm.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899212,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dns-records-office365/mdm.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT700",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/dnszones/cname"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT700",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "dnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the DNS Zone."
+ },
+ "value": "contoso.local"
+ },
+ "ttl": {
+ "type": "int",
+ "defaultValue": "3600",
+ "metadata": {
+ "description": "Time to live value, in seconds."
+ },
+ "value": 3600
+ },
+ "recordTypes": {
+ "value": [
+ "mail",
+ "mdm",
+ "sfb"
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/enterpriseregistration",
+ "apiVersion": "2018-05-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "enterpriseregistration.windows.net"
+ }
+ }
+ },
+ {
+ "comments": "CNAME record needed for Mobile Device Management (MDM) with Office 365.",
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/enterpriseenrollment",
+ "apiVersion": "2018-05-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "enterpriseenrollment.manage.microsoft.com"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT701 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT701
new file mode 100644
index 0000000..8dbb0c6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT701
@@ -0,0 +1,143 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dns-records-office365/sfb.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899223,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dns-records-office365/sfb.json",
+ "/demos/dns-records-office365/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT701",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/dnszones/cname",
+ "microsoft.network/dnszones/srv"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT701",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "dnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the DNS Zone."
+ },
+ "value": "contoso.local"
+ },
+ "ttl": {
+ "type": "int",
+ "defaultValue": "3600",
+ "metadata": {
+ "description": "Time to live value, in seconds."
+ },
+ "value": 3600
+ },
+ "recordTypes": {
+ "value": [
+ "mail",
+ "mdm",
+ "sfb"
+ ]
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "comments": "CNAME record needed for autodiscover endpoint for making it easier to configure Outlook.",
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/autodiscover",
+ "apiVersion": "2018-05-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "autodiscover.outlook.com"
+ }
+ }
+ },
+ {
+ "comments": "CNAME record needed for autodiscover endpoint for making it easier to configure Skype for Business.",
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/lyncdiscover",
+ "apiVersion": "2016-04-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "webdir.online.lync.com"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/msoid",
+ "apiVersion": "2016-04-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "clientconfig.microsoftonline-p.net"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/dnszones/CNAME",
+ "name": "contoso.local/sip",
+ "apiVersion": "2016-04-01",
+ "properties": {
+ "TTL": 3600,
+ "CNAMERecord": {
+ "cname": "sipdir.online.lync.com"
+ }
+ }
+ },
+ {
+ "comments": "SRV record to specify sip federation location for Skype for Business.",
+ "type": "Microsoft.Network/dnszones/SRV",
+ "name": "contoso.local/_sipfederationtls._tcp",
+ "apiVersion": "2016-04-01",
+ "properties": {
+ "TTL": 3600,
+ "SRVRecords": [
+ {
+ "port": 5061,
+ "priority": 100,
+ "target": "sipfed.online.lync.com",
+ "weight": 1
+ }
+ ]
+ }
+ },
+ {
+ "comments": "SRV record to specify sip location for Skype for Business.",
+ "type": "Microsoft.Network/dnszones/SRV",
+ "name": "contoso.local/_sip._tls",
+ "apiVersion": "2016-04-01",
+ "properties": {
+ "TTL": 3600,
+ "SRVRecords": [
+ {
+ "port": 443,
+ "priority": 100,
+ "target": "sipdir.online.lync.com",
+ "weight": 1
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT702 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT702
new file mode 100644
index 0000000..0f892fc
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT702
@@ -0,0 +1,138 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/docker-rancher/azuredeploy.json",
+ "/demos/docker-rancher/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899232,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/docker-rancher/azuredeploy.json",
+ "/demos/docker-rancher/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT702",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT702",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "uniqueDeployPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "The unique prefix used for the nodes & dns. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The size of the virtual machine used for the deployment"
+ },
+ "defaultValue": "Standard_A2_v2",
+ "value": "Standard_A2_v2"
+ },
+ "deploymentType": {
+ "type": "string",
+ "defaultValue": "Server",
+ "allowedValues": [
+ "Nodes",
+ "Server"
+ ],
+ "metadata": {
+ "description": "Choose if you want to add nodes to an existing server or deploy a server without any nodes."
+ },
+ "value": "Server"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. For example, if stored on a public GitHub repo, you'd use the following URI: https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/docker-rancher/."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. If your artifacts are stored on a public repo or public storage account you can leave this blank."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "deployTypeParam": {
+ "Nodes": "nodes.json",
+ "Server": "server.json"
+ },
+ "deployTypeParamValue": "(deployTypeParam)[parameters(deploymentType)]",
+ "templateDeployUrl": "[uri(parameters('_artifactsLocation'), concat(variables('deployTypeParamValue'), parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "name": "rancherdeploy",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-09-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat(variables('deployTypeParamValue'), parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "rancherName": {
+ "value": "GEN-UNIQUE"
+ },
+ "rancherVmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT703 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT703
new file mode 100644
index 0000000..6ef2136
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT703
@@ -0,0 +1,361 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/docker-rancher/nodes.json",
+ "/demos/docker-rancher/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899241,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/docker-rancher/nodes.json",
+ "/demos/docker-rancher/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT703",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT703",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "rancherApi": {
+ "type": "string",
+ "metadata": {
+ "description": "The api link to your RancherHost. Example : http://myrancherhost.kvaes.be:8080/v1/scripts/AA12A123A1A1234A12A1:1234567890000:aAaaaaA1AaAaAlaAAaaaaAAAaaA"
+ }
+ },
+ "rancherName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The prefix you want to use as hostname"
+ }
+ },
+ "rancherVmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The size of the virtual machine used for the nodes"
+ },
+ "defaultValue": "Standard_A2_v2"
+ },
+ "rancherCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The amount of nodes to be provisioned"
+ },
+ "minValue": 1,
+ "maxValue": 250
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "uniqueDeployPrefix": {
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "deploymentType": {
+ "value": "Server"
+ }
+ },
+ "variables": {
+ "availabilitySet": "",
+ "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'ranchernode')]",
+ "networkSecurityGroupName": "",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "ubuntuOSVersion": "18.04-LTS",
+ "virtualNetworkName": "",
+ "addressPrefix": "192.168.253.0/24",
+ "subnetName": "",
+ "subnetPrefix": "192.168.253.0/24",
+ "publicIPAddressType": "Dynamic",
+ "storageAccountType": "Standard_LRS",
+ "vmSize": "Standard_A2_v2",
+ "extensionName": "DockerExtension",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/ variables('virtualNetworkName')/ variables('subnetName')"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-04-01",
+ "location": "location",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "",
+ "apiVersion": "2020-06-01",
+ "location": "location",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "",
+ "apiVersion": "2020-05-01",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "SSH",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "rVPN500",
+ "properties": {
+ "description": "rVPN500",
+ "protocol": "Udp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "500",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 300,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "rVPN4500",
+ "properties": {
+ "description": "rVPN4500",
+ "protocol": "Udp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4500",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 400,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Docker",
+ "properties": {
+ "description": "Docker",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "2375",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups// variables('networkSecurityGroupName')"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "192.168.253.0/24"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "",
+ "properties": {
+ "addressPrefix": "192.168.253.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/ variables('networkSecurityGroupName')"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "parameters('rancherName')copyIndex()",
+ "location": "location",
+ "copy": {
+ "name": "pipLoopNode",
+ "count": 1
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "parameters('rancherName')copyIndex()"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "parameters('rancherName')copyIndex()-nic",
+ "location": "location",
+ "copy": {
+ "name": "nicLoopNode",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//parameters('rancherName')copyIndex()",
+ "Microsoft.Network/virtualNetworks// variables('virtualNetworkName')"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/parameters('rancherName')copyIndex()"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/ variables('virtualNetworkName')/ variables('subnetName')"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "parameters('rancherName')copyIndex()",
+ "location": "location",
+ "copy": {
+ "name": "vmLoopNode",
+ "count": 1
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', concat(parameters('rancherName'), copyIndex(), '-nic'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "osProfile": {
+ "computerName": "parameters('rancherName')copyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "parameters('rancherName')copyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/parameters('rancherName')copyIndex()-nic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "parameters('rancherName')copyIndex()/DockerExtension",
+ "apiVersion": "2019-12-01",
+ "location": "location",
+ "copy": {
+ "name": "extLoopNode",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//parameters('rancherName')copyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "DockerExtension",
+ "typeHandlerVersion": "1.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "docker": {
+ "port": "2375"
+ },
+ "compose": {
+ "rancheragent": {
+ "image": "rancher/agent:latest",
+ "restart": "always",
+ "privileged": true,
+ "volumes": [
+ "/var/run/docker.sock:/var/run/docker.sock"
+ ],
+ "command": "rancherApi"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT704 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT704
new file mode 100644
index 0000000..dafd780
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT704
@@ -0,0 +1,332 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/docker-rancher/server.json",
+ "/demos/docker-rancher/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899251,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/docker-rancher/server.json",
+ "/demos/docker-rancher/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT704",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT704",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "maxLength": 72,
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "rancherName": {
+ "type": "string",
+ "metadata": {
+ "description": "The prefix you want to use as hostname"
+ }
+ },
+ "rancherVmSize": {
+ "defaultValue": "Standard_A2_v2",
+ "type": "String",
+ "metadata": {
+ "description": "The size of the virtual machine for the Server"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources, ex eastus2, westus2..."
+ }
+ },
+ "osImageSKU": {
+ "defaultValue": "18.04-LTS",
+ "allowedValues": [
+ "16.04-LTS",
+ "18.04-LTS"
+ ],
+ "type": "String",
+ "metadata": {
+ "description": "Set the OS Image SKU"
+ }
+ },
+ "storageAccountType": {
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "type": "String",
+ "metadata": {
+ "description": "Set the Virtual Machine OS Disk type"
+ }
+ },
+ "uniqueDeployPrefix": {
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "deploymentType": {
+ "value": "Server"
+ }
+ },
+ "variables": {
+ "availabilitySetName": "[toLower(concat(parameters('rancherName'), '-avset'))]",
+ "vmSize": "Standard_A2_v2",
+ "osImagePublisher": "Canonical",
+ "osImageOffer": "UbuntuServer",
+ "osImageVersion": "latest",
+ "virtualNetworkName": "[toLower(concat(parameters('rancherName'), '-vnet'))]",
+ "addressPrefix": "192.168.254.0/24",
+ "subnetName": "[toLower(concat(parameters('rancherName'), '-subnet'))]",
+ "subnetPrefix": "192.168.254.0/24",
+ "NICPrefix": "-nic",
+ "publicIPAddressType": "Dynamic",
+ "publicIPAddressName1": "[toLower(concat(parameters('rancherName'), '-pip1'))]",
+ "networkSecurityGroupName": "[toLower(concat(parameters('rancherName'), '-nsg'))]",
+ "extensionName": "DockerExtension"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2020-06-01",
+ "name": "[toLower(concat(parameters('rancherName'), '-avset'))]",
+ "location": "location",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 1,
+ "platformUpdateDomainCount": 1
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-12-01",
+ "name": "[toLower(concat(parameters('rancherName'), '-nsg'))]",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "SSH",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Rancher",
+ "properties": {
+ "description": "Rancher-HTTPS",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Docker",
+ "properties": {
+ "description": "Docker",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "2375",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 300,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-05-01",
+ "name": "[toLower(concat(parameters('rancherName'), '-vnet'))]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups//[toLower(concat(parameters('rancherName'), '-nsg'))]"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "192.168.254.0/24"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "[toLower(concat(parameters('rancherName'), '-subnet'))]",
+ "properties": {
+ "addressPrefix": "192.168.254.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[toLower(concat(parameters('rancherName'), '-nsg'))]"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-05-01",
+ "name": "[toLower(concat(parameters('rancherName'), '-pip1'))]",
+ "location": "location",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "rancherName"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-05-01",
+ "name": "rancherName-nic",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//[toLower(concat(parameters('rancherName'), '-pip1'))]",
+ "Microsoft.Network/virtualNetworks//[toLower(concat(parameters('rancherName'), '-vnet'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[toLower(concat(parameters('rancherName'), '-pip1'))]"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[toLower(concat(parameters('rancherName'), '-vnet'))]/[toLower(concat(parameters('rancherName'), '-subnet'))]"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2019-12-01",
+ "name": "rancherName",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//rancherName-nic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "osProfile": {
+ "computerName": "rancherName",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "rancherName_Os_Disk_1",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Standard_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/rancherName-nic"
+ }
+ ]
+ },
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/[toLower(concat(parameters('rancherName'), '-avset'))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2019-12-01",
+ "name": "rancherName/DockerExtension",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//rancherName"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "DockerExtension",
+ "typeHandlerVersion": "1.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "docker": {
+ "port": "2375"
+ },
+ "compose": {
+ "rancheragent": {
+ "image": "rancher/rancher:stable",
+ "restart": "always",
+ "ports": [
+ "8443:443"
+ ]
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT705 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT705
new file mode 100644
index 0000000..41f2d01
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT705
@@ -0,0 +1,320 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dsc-extension-iis-server-windows-vm/azuredeploy.json",
+ "/demos/dsc-extension-iis-server-windows-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899272,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dsc-extension-iis-server-windows-vm/azuredeploy.json",
+ "/demos/dsc-extension-iis-server-windows-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT705",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT705",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "diskType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "Type of the Storage for disks"
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "iis",
+ "metadata": {
+ "description": "Name of the VM"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A2_v2",
+ "metadata": {
+ "description": "Size of the VM"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2019-Datacenter",
+ "allowedValues": [
+ "2012-R2-Datacenter",
+ "2016-Datacenter",
+ "2019-Datacenter"
+ ],
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "moduleFilePath": {
+ "type": "string",
+ "metadata": {
+ "description": "Relative path for the DSC configuration module."
+ },
+ "defaultValue": "ContosoWebsite.ps1.zip"
+ },
+ "configurationFunction": {
+ "type": "string",
+ "defaultValue": "ContosoWebsite.ps1\\ContosoWebsite",
+ "metadata": {
+ "description": "DSC configuration function to call"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "virtualNetworkName": "dscVNET",
+ "vnetAddressPrefix": "10.0.0.0/16",
+ "subnet1Name": "dscSubnet-1",
+ "subnet1Prefix": "10.0.0.0/24",
+ "subnet1Ref": "Microsoft.Network/virtualNetworks/subnets/dscVNET/dscSubnet-1",
+ "publicIPAddressType": "Dynamic",
+ "publicIPAddressName": "dscPubIP",
+ "nicName": "dscNIC",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "vmExtensionName": "dscExtension",
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "dscPubIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-05-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-80",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "80",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "default-allow-443",
+ "properties": {
+ "priority": 1001,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "443",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1002,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "dscVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "dscSubnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "dscNIC",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/dscPubIP",
+ "Microsoft.Network/virtualNetworks/dscVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dscPubIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/dscVNET/dscSubnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "iis",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/dscNIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "osProfile": {
+ "computerName": "iis",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "iis_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dscNIC"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "iis/dscExtension",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/iis"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), concat(parameters('moduleFilePath'), parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "ContosoWebsite.ps1\\ContosoWebsite",
+ "Properties": {
+ "MachineName": "iis"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT706 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT706
new file mode 100644
index 0000000..90364c3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT706
@@ -0,0 +1,299 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dsc-pullserver-to-win-server/azuredeploy.json",
+ "/demos/dsc-pullserver-to-win-server/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899307,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dsc-pullserver-to-win-server/azuredeploy.json",
+ "/demos/dsc-pullserver-to-win-server/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT706",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT706",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The admin user name for the VM created."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The admin password for the VM created."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "The machine type for the server vm."
+ },
+ "value": "Standard_A2"
+ },
+ "dscPullSrvName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Windows vm."
+ },
+ "value": "PullSrv"
+ },
+ "dscPullIPDnsName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the public ip address"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "VirtualNetworkPrefix": "10.0.0.0/16",
+ "VirtualNetworkSubnet1Name": "Subnet-1",
+ "VirtualNetworkSubnet1Prefix": "10.0.0.0/24",
+ "VirtualNetworkSubnet2Name": "Subnet-2",
+ "VirtualNetworkSubnet2Prefix": "10.0.1.0/24",
+ "dscPullSrvSubnetRef": "Microsoft.Network/virtualNetworks/subnets/dscVirtualNetwork/Subnet-1",
+ "dscPullSrvNicName": "dscNetworkInterface",
+ "dscPullIPName": "dscPublicIPAddress",
+ "deployDSCPullServerConfigurationFile": "[uri(parameters('_artifactsLocation'), concat('ConfigurePullServer.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "deployDSCPullServerConfigurationFunction": "ConfigurePullServer.ps1\\ConfigurePullServer",
+ "windowsOSVersion": "2012-R2-Datacenter",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-11-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-80",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "80",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1001,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "dscVirtualNetwork",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "tags": {
+ "displayName": "VirtualNetwork"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ },
+ {
+ "name": "Subnet-2",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "dscNetworkInterface",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//dscVirtualNetwork"
+ ],
+ "tags": {
+ "displayName": "dscPullSrvNic"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAddress": "10.0.0.5",
+ "privateIPAllocationMethod": "Static",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/dscVirtualNetwork/Subnet-1"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dscPublicIPAddress"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "PullSrv",
+ "type": "Microsoft.Compute/virtualMachines",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//dscNetworkInterface"
+ ],
+ "tags": {
+ "displayName": "dscPullSrv"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "PullSrv",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "PullSrv_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dscNetworkInterface"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "deployDSCPullServer",
+ "type": "extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//PullSrv"
+ ],
+ "tags": {
+ "displayName": "deployDSCPullServer"
+ },
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "[uri(parameters('_artifactsLocation'), concat('ConfigurePullServer.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "configurationFunction": "ConfigurePullServer.ps1\\ConfigurePullServer"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "dscPublicIPAddress",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "tags": {
+ "displayName": "dscPullIP"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT707 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT707
new file mode 100644
index 0000000..b691dfb
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT707
@@ -0,0 +1,89 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/dynamic-web-tests/prereqs/prereq.azuredeploy.json",
+ "/demos/dynamic-web-tests/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899318,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/dynamic-web-tests/prereqs/prereq.azuredeploy.json",
+ "/demos/dynamic-web-tests/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT707",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.insights/components"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT707",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "name": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Application Insights resource."
+ },
+ "value": "new_app_insights_resource"
+ },
+ "type": {
+ "type": "string",
+ "defaultValue": "web",
+ "metadata": {
+ "description": "Type of app you are deploying. This field is for legacy reasons and will not impact the type of App Insights resource you deploy."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "requestSource": {
+ "type": "string",
+ "defaultValue": "CustomDeployment",
+ "metadata": {
+ "description": "Source of Azure Resource Manager deployment"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "new_app_insights_resource",
+ "type": "microsoft.insights/components",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-02-02",
+ "properties": {
+ "ApplicationId": "new_app_insights_resource",
+ "Application_Type": "web",
+ "Flow_Type": "Redfield",
+ "Request_Source": "CustomDeployment"
+ }
+ }
+ ],
+ "outputs": {
+ "appName": {
+ "type": "string",
+ "value": "[parameters('name')]"
+ },
+ "appInsightsResource": {
+ "type": "string",
+ "value": "[resourceId('microsoft.insights/components', parameters('name'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT708 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT708
new file mode 100644
index 0000000..a003663
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT708
@@ -0,0 +1,414 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/e-shop-website-with-ilb-ase/prereqs/prereq.azuredeploy.json",
+ "/demos/e-shop-website-with-ilb-ase/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899332,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/e-shop-website-with-ilb-ase/prereqs/prereq.azuredeploy.json",
+ "/demos/e-shop-website-with-ilb-ase/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT708",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/routetables",
+ "microsoft.web/hostingenvironments",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT708",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "name": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the App Service Environment."
+ },
+ "value": "GEN-UNIQUE-16"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of the App Service Environment."
+ }
+ }
+ },
+ "variables": {
+ "location": "[resourceGroup().location]",
+ "vnetName": "GEN-UNIQUE-16-vnet",
+ "vnetAddressPrefix": "192.168.250.0/23",
+ "aseSubnetName": "GEN-UNIQUE-16-subnet",
+ "aseSubnetAddressPrefix": "192.168.250.0/24",
+ "subnetRouteTableName": "GEN-UNIQUE-16-route-table",
+ "subnetNSGName": "GEN-UNIQUE-16-nsg"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/hostingEnvironments",
+ "name": "GEN-UNIQUE-16",
+ "location": "[resourceGroup().location]",
+ "kind": "ASEV2",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-16-vnet"
+ ],
+ "properties": {
+ "name": "GEN-UNIQUE-16",
+ "location": "[resourceGroup().location]",
+ "virtualNetwork": {
+ "Id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-16-vnet/GEN-UNIQUE-16-subnet",
+ "Subnet": "GEN-UNIQUE-16-subnet"
+ },
+ "internalLoadBalancingMode": 3
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE-16-vnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups//GEN-UNIQUE-16-nsg",
+ "Microsoft.Network/routeTables//GEN-UNIQUE-16-route-table"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "192.168.250.0/23"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE-16-subnet",
+ "properties": {
+ "addressPrefix": "192.168.250.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-16-nsg"
+ },
+ "routeTable": {
+ "id": "Microsoft.Network/routeTables/GEN-UNIQUE-16-route-table"
+ },
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Sql",
+ "locations": [
+ "[resourceGroup().location]"
+ ]
+ },
+ {
+ "service": "Microsoft.Storage",
+ "locations": [
+ "[resourceGroup().location]"
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/routeTables",
+ "name": "GEN-UNIQUE-16-route-table",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "UDR - Subnet"
+ },
+ "properties": {
+ "routes": [
+ {
+ "name": "GEN-UNIQUE-16-route",
+ "properties": {
+ "addressPrefix": "0.0.0.0/0",
+ "nextHopType": "Internet"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "GEN-UNIQUE-16-nsg",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "NSG - Subnet"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Inbound-management",
+ "properties": {
+ "description": "Used to manage ASE from public VIP",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "454-455",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "ASE-internal-inbound",
+ "properties": {
+ "description": "ASE-internal-inbound",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "192.168.250.0/24",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-HTTP",
+ "properties": {
+ "description": "Allow HTTP",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbount-HTTPS",
+ "properties": {
+ "description": "Allow HTTPS",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-FTP",
+ "properties": {
+ "description": "Allow FTP over port 21",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-FTPS",
+ "properties": {
+ "description": "Allow FTPS",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "990",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-FTP-Data",
+ "properties": {
+ "description": "RDP",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10001-10020",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Inbound-Remote-Debugging",
+ "properties": {
+ "description": "Visual Studio remote debugging",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4016-4022",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Outbound-443",
+ "properties": {
+ "description": "Azure Storage blob",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-SMB",
+ "properties": {
+ "description": "Azure Storage queue",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "445",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DB",
+ "properties": {
+ "description": "Database",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "1433",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DB2",
+ "properties": {
+ "description": "Database 2",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "11000-11999",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DB3",
+ "properties": {
+ "description": "Database 3",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "14000-14999",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-DNS",
+ "properties": {
+ "description": "DNS",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "53",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "ASE-internal-outbound",
+ "properties": {
+ "description": "Azure Storage queue",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "192.168.250.0/24",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Outbound-80",
+ "properties": {
+ "description": "Outbound 80",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "ASE-to-VNET",
+ "properties": {
+ "description": "ASE to VNET",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "192.168.250.0/23",
+ "access": "Allow",
+ "priority": 180,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "existingASEName": {
+ "type": "string",
+ "value": "[parameters('name')]"
+ },
+ "existingASELocation": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ },
+ "existingASEDNSSuffix": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Web/hostingEnvironments', parameters('name')), '2019-08-01').dnsSuffix]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT709 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT709
new file mode 100644
index 0000000..f2f3cc0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT709
@@ -0,0 +1,913 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/e-shop-website-with-ilb-ase/azuredeploy.json",
+ "/demos/e-shop-website-with-ilb-ase/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899344,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/e-shop-website-with-ilb-ase/azuredeploy.json",
+ "/demos/e-shop-website-with-ilb-ase/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT709",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.web/sites",
+ "microsoft.cdn/profiles",
+ "microsoft.sql/servers",
+ "microsoft.cache/redis",
+ "microsoft.network/virtualnetworks/subnets",
+ "microsoft.network/applicationgateways",
+ "microsoft.storage/storageaccounts",
+ "microsoft.web/serverfarms",
+ "microsoft.insights/components"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT709",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "existingASEName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the App Service Environment."
+ },
+ "value": "GET-PREREQ-existingASEName"
+ },
+ "existingASELocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of the App Service Environment."
+ },
+ "value": "GET-PREREQ-existingASELocation"
+ },
+ "existingASEDNSSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Suffix used for the ILB ASE"
+ },
+ "value": "internal-contoso.com"
+ },
+ "dnsSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Root domain name used to access web apps on internet."
+ },
+ "value": "contoso.com"
+ },
+ "sqlServerAdministratorLogin": {
+ "type": "string",
+ "metadata": {
+ "description": "Administrator login name of the Azure SQL Server."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sqlServerAdministratorLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Administrator login password of the Azure SQL Server."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "azureAdTenantId": {
+ "type": "string",
+ "metadata": {
+ "description": "Directory ID of the Azure Active Directory used by the Admin App."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "azureAdClientId": {
+ "type": "string",
+ "metadata": {
+ "description": "Application ID of the Admin App Registration."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "appInsightsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "description"
+ },
+ "value": "East US"
+ }
+ },
+ "variables": {
+ "location": "existingAseLocation",
+ "vnetName": "existingAseName-vnet",
+ "aseSubnetName": "existingAseName-subnet",
+ "aseSubnetAddressPrefix": "192.168.251.64/26",
+ "agSubnetName": "app-gateway-subnet",
+ "aspName": "existingAseName-asp",
+ "webAppName": "existingAseName-web",
+ "contentAppName": "existingAseName-content",
+ "apiAppName": "existingAseName-api",
+ "adminAppName": "existingAseName-admin",
+ "appInsightsName": "existingAseName-app-insights",
+ "sqlServerName": "existingAseName-sql-server",
+ "storageAccountName": "[concat(replace(parameters('existingAseName'), '-', ''), '')]",
+ "redisCacheName": "existingAseName-cache",
+ "redisCacheSubnetName": "redis-cache-subnet",
+ "redisCacheSubnetAddressPrefix": "192.168.251.0/26",
+ "redisCacheStaticIP": "192.168.251.62",
+ "appGatewayName": "existingAseName-waf",
+ "appGatewayPublicIPName": "existingAseName-waf-ip",
+ "appGatewayPublicIPDnsPrefix": "existingAseName-waf",
+ "cdnName": "existingAseName-cdn",
+ "cdnWebAppEndpointName": "existingAseName-cdn-web",
+ "cdnStorageEndpointName": "existingAseName-cdn-storage",
+ "webAppExternalHostName": "existingAseName-web.contoso.com",
+ "webAppInternalHostName": "existingAseName-web.internal-contoso.com",
+ "apiAppInternalHostName": "existingAseName-api.internal-contoso.com",
+ "contentAppExternalHostName": "existingAseName-content.contoso.com",
+ "contentAppInternalHostName": "existingAseName-content.internal-contoso.com",
+ "adminAppExternalHostName": "existingAseName-admin.contoso.com",
+ "adminAppInternalHostName": "existingAseName-admin.internal-contoso.com",
+ "sourceCodeRepositoryURL": "https://github.com/OGCanviz/e-shop-website-with-ilb-ase/"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "existingAseName-vnet/redis-cache-subnet",
+ "properties": {
+ "addressPrefix": "192.168.251.0/26"
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "existingAseName-vnet/app-gateway-subnet",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/subnets//existingAseName-vnet/redis-cache-subnet"
+ ],
+ "properties": {
+ "addressPrefix": "192.168.251.64/26"
+ }
+ },
+ {
+ "apiVersion": "2020-02-02",
+ "type": "microsoft.insights/components",
+ "name": "existingAseName-app-insights",
+ "location": "East US",
+ "properties": {
+ "Application_Type": "web",
+ "Request_Source": "IbizaWebAppExtensionCreate"
+ }
+ },
+ {
+ "apiVersion": "2021-04-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "location": "existingAseLocation",
+ "sku": {
+ "name": "Standard_RAGRS"
+ },
+ "kind": "StorageV2",
+ "properties": {
+ "supportsHttpsTrafficOnly": false,
+ "accessTier": "Hot",
+ "encryption": {
+ "services": {
+ "blob": {
+ "enabled": true
+ },
+ "file": {
+ "enabled": true
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Cache/Redis",
+ "name": "existingAseName-cache",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/subnets//existingAseName-vnet/redis-cache-subnet"
+ ],
+ "properties": {
+ "sku": {
+ "name": "Premium",
+ "family": "P",
+ "capacity": 1
+ },
+ "subnetId": "Microsoft.Network/virtualNetworks/subnets//existingAseName-vnet/redis-cache-subnet",
+ "staticIP": "192.168.251.62",
+ "enableNonSslPort": true
+ }
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/serverfarms",
+ "name": "existingAseName-asp",
+ "location": "existingAseLocation",
+ "kind": "app",
+ "properties": {
+ "name": "existingAseName-asp",
+ "workerSize": "0",
+ "workerSizeId": "0",
+ "numberOfWorkers": "1",
+ "reserved": false,
+ "hostingEnvironment": "existingAseName"
+ },
+ "sku": {
+ "tier": "Isolated",
+ "name": "I1"
+ }
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/sites",
+ "name": "existingAseName-content",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "Microsoft.Web/serverfarms//existingAseName-asp"
+ ],
+ "properties": {
+ "name": "existingAseName-content",
+ "serverFarmId": "Microsoft.Web/serverfarms//existingAseName-asp",
+ "hostingEnvironment": "existingAseName",
+ "siteConfig": {
+ "alwaysOn": true,
+ "appSettings": [
+ {
+ "name": "project",
+ "value": "src/Web/wwwroot"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "name": "web",
+ "type": "sourcecontrols",
+ "dependsOn": [
+ "Microsoft.Web/sites//existingAseName-content"
+ ],
+ "properties": {
+ "RepoUrl": "https://github.com/OGCanviz/e-shop-website-with-ilb-ase/",
+ "branch": "master",
+ "IsManualIntegration": true
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/sites",
+ "name": "existingAseName-api",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "Microsoft.Web/serverfarms//existingAseName-asp",
+ "microsoft.insights/components//existingAseName-app-insights"
+ ],
+ "properties": {
+ "name": "existingAseName-api",
+ "serverFarmId": "Microsoft.Web/serverfarms//existingAseName-asp",
+ "hostingEnvironment": "existingAseName",
+ "siteConfig": {
+ "alwaysOn": true,
+ "appSettings": [
+ {
+ "name": "ApplicationInsights:InstrumentationKey",
+ "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2020-02-02').InstrumentationKey]"
+ },
+ {
+ "name": "project",
+ "value": "src/API/API.csproj"
+ }
+ ],
+ "connectionstrings": [
+ {
+ "name": "SalesConnection",
+ "type": "SQLAzure",
+ "connectionString": "[concat('Server=tcp:', reference(variables('sqlServerName')).fullyQualifiedDomainName, ',1433;Initial Catalog=Sales;Persist Security Info=False;User ID=', parameters('sqlServerAdministratorLogin'), ';Password=', parameters('sqlServerAdministratorLoginPassword'), ';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "name": "web",
+ "type": "sourcecontrols",
+ "dependsOn": [
+ "Microsoft.Web/sites//existingAseName-api"
+ ],
+ "properties": {
+ "RepoUrl": "https://github.com/OGCanviz/e-shop-website-with-ilb-ase/",
+ "branch": "master",
+ "IsManualIntegration": true
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/sites",
+ "name": "existingAseName-admin",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "Microsoft.Web/serverfarms//existingAseName-asp",
+ "microsoft.insights/components//existingAseName-app-insights"
+ ],
+ "properties": {
+ "name": "existingAseName-admin",
+ "serverFarmId": "Microsoft.Web/serverfarms//existingAseName-asp",
+ "hostingEnvironment": "existingAseName",
+ "siteConfig": {
+ "alwaysOn": true,
+ "appSettings": [
+ {
+ "name": "AzureAd:Domain",
+ "value": ""
+ },
+ {
+ "name": "AzureAd:TenantId",
+ "value": "GEN-UNIQUE"
+ },
+ {
+ "name": "AzureAd:ClientId",
+ "value": "GEN-UNIQUE"
+ },
+ {
+ "name": "ODataServiceBaseUrl",
+ "value": "http://existingAseName-api.internal-contoso.com"
+ },
+ {
+ "name": "ApplicationInsights:InstrumentationKey",
+ "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2020-02-02').InstrumentationKey]"
+ },
+ {
+ "name": "project",
+ "value": "src/Admin/Admin.csproj"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "name": "web",
+ "type": "sourcecontrols",
+ "dependsOn": [
+ "Microsoft.Web/sites//existingAseName-admin",
+ "Microsoft.Web/sites/sourcecontrols//existingAseName-api/web"
+ ],
+ "properties": {
+ "RepoUrl": "https://github.com/OGCanviz/e-shop-website-with-ilb-ase/",
+ "branch": "master",
+ "IsManualIntegration": true
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/sites",
+ "name": "existingAseName-web",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "[resourceId('Microsoft.Web/serverfarms/', variables('aspName'))]",
+ "[resourceId('microsoft.insights/components/', variables('appInsightsName'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
+ "[resourceId('Microsoft.Cache/Redis/', variables('redisCacheName'))]"
+ ],
+ "properties": {
+ "name": "existingAseName-web",
+ "serverFarmId": "Microsoft.Web/serverfarms//existingAseName-asp",
+ "hostingEnvironment": "existingAseName",
+ "siteConfig": {
+ "alwaysOn": true,
+ "appSettings": [
+ {
+ "name": "ODataServiceBaseUrl",
+ "value": "http://existingAseName-api.internal-contoso.com"
+ },
+ {
+ "name": "cdn:url",
+ "value": "[concat('http://', reference(resourceId('microsoft.cdn/profiles/endpoints/', variables('cdnName'), variables('cdnWebAppEndpointName')), '2020-09-01').hostName)]"
+ },
+ {
+ "name": "CatalogBaseUrl",
+ "value": "https://existingAseName-cdn-storage.azureedge.net"
+ },
+ {
+ "name": "ApplicationInsights:InstrumentationKey",
+ "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2020-02-02').InstrumentationKey]"
+ },
+ {
+ "name": "project",
+ "value": "src/Web/Web.csproj"
+ }
+ ],
+ "connectionstrings": [
+ {
+ "name": "CatalogConnection",
+ "type": "SQLAzure",
+ "connectionString": "[concat('Server=tcp:', reference(variables('sqlServerName')).fullyQualifiedDomainName, ',1433;Initial Catalog=Catalog;Persist Security Info=False;User ID=', parameters('sqlServerAdministratorLogin'), ';Password=', parameters('sqlServerAdministratorLoginPassword'), ';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]"
+ },
+ {
+ "name": "SalesConnection",
+ "type": "SQLAzure",
+ "connectionString": "[concat('Server=tcp:', reference(variables('sqlServerName')).fullyQualifiedDomainName, ',1433;Initial Catalog=Sales;Persist Security Info=False;User ID=', parameters('sqlServerAdministratorLogin'), ';Password=', parameters('sqlServerAdministratorLoginPassword'), ';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]"
+ },
+ {
+ "name": "IdentityConnection",
+ "type": "SQLAzure",
+ "connectionString": "[concat('Server=tcp:', reference(variables('sqlServerName')).fullyQualifiedDomainName, ',1433;Initial Catalog=Identity;Persist Security Info=False;User ID=', parameters('sqlServerAdministratorLogin'), ';Password=', parameters('sqlServerAdministratorLoginPassword'), ';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]"
+ },
+ {
+ "name": "StorageConnection",
+ "type": "Custom",
+ "connectionString": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listkeys(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), '2021-04-01').keys[0].value,';')]"
+ },
+ {
+ "name": "RedisConnection",
+ "type": "Custom",
+ "connectionString": "[concat(variables('redisCacheName'), '.redis.cache.windows.net:6380,password=', listKeys(resourceId('Microsoft.Cache/Redis/', variables('redisCacheName')), '2020-06-01').primaryKey, ',ssl=True,abortConnect=False')]"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "name": "web",
+ "type": "sourcecontrols",
+ "dependsOn": [
+ "Microsoft.Web/sites//existingAseName-web",
+ "Microsoft.Web/sites/sourcecontrols//existingAseName-admin/web"
+ ],
+ "properties": {
+ "RepoUrl": "https://github.com/OGCanviz/e-shop-website-with-ilb-ase/",
+ "branch": "master",
+ "IsManualIntegration": true
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-11-01-preview",
+ "type": "Microsoft.Sql/servers",
+ "location": "existingAseLocation",
+ "name": "existingAseName-sql-server",
+ "properties": {
+ "administratorLogin": "GEN-UNIQUE",
+ "administratorLoginPassword": "GEN-PASSWORD",
+ "version": "12.0"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01-preview",
+ "type": "databases",
+ "location": "existingAseLocation",
+ "name": "Catalog",
+ "dependsOn": [
+ "Microsoft.Sql/servers//existingAseName-sql-server"
+ ],
+ "properties": {
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "edition": "Basic",
+ "zoneRedundant": false
+ }
+ },
+ {
+ "apiVersion": "2020-11-01-preview",
+ "type": "databases",
+ "location": "existingAseLocation",
+ "name": "Sales",
+ "dependsOn": [
+ "Microsoft.Sql/servers//existingAseName-sql-server"
+ ],
+ "properties": {
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "edition": "Basic",
+ "zoneRedundant": false
+ }
+ },
+ {
+ "apiVersion": "2020-11-01-preview",
+ "type": "databases",
+ "location": "existingAseLocation",
+ "name": "Identity",
+ "dependsOn": [
+ "Microsoft.Sql/servers//existingAseName-sql-server"
+ ],
+ "properties": {
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "edition": "Basic",
+ "zoneRedundant": false
+ }
+ },
+ {
+ "apiVersion": "2020-11-01-preview",
+ "type": "virtualNetworkRules",
+ "name": "allow-access-from-existingAseName-subnet",
+ "dependsOn": [
+ "Microsoft.Sql/servers//existingAseName-sql-server"
+ ],
+ "properties": {
+ "virtualNetworkSubnetId": "Microsoft.Network/virtualNetworks/subnets//existingAseName-vnet/existingAseName-subnet"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/applicationGateways",
+ "name": "existingAseName-waf",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/subnets//existingAseName-vnet/app-gateway-subnet",
+ "Microsoft.Network/publicIPAddresses//existingAseName-waf-ip"
+ ],
+ "properties": {
+ "sku": {
+ "name": "WAF_Medium",
+ "tier": "WAF",
+ "capacity": 1
+ },
+ "gatewayIPConfigurations": [
+ {
+ "name": "appGatewayIpConfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//existingAseName-vnet/app-gateway-subnet"
+ }
+ }
+ }
+ ],
+ "frontendIPConfigurations": [
+ {
+ "name": "appGatewayFrontendIP",
+ "properties": {
+ "PublicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses//existingAseName-waf-ip"
+ }
+ }
+ }
+ ],
+ "frontendPorts": [
+ {
+ "name": "appGatewayFrontendPort",
+ "properties": {
+ "Port": 80
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "webAppBackendPool",
+ "properties": {
+ "BackendAddresses": [
+ {
+ "fqdn": "existingAseName-web.internal-contoso.com"
+ }
+ ]
+ }
+ },
+ {
+ "name": "contentAppBackendPool",
+ "properties": {
+ "BackendAddresses": [
+ {
+ "fqdn": "existingAseName-content.internal-contoso.com"
+ }
+ ]
+ }
+ },
+ {
+ "name": "adminAppBackendPool",
+ "properties": {
+ "BackendAddresses": [
+ {
+ "fqdn": "existingAseName-admin.internal-contoso.com"
+ }
+ ]
+ }
+ }
+ ],
+ "backendHttpSettingsCollection": [
+ {
+ "name": "webAppBackendHttpSettings",
+ "properties": {
+ "Port": 80,
+ "Protocol": "Http",
+ "CookieBasedAffinity": "Disabled",
+ "PickHostNameFromBackendAddress": false,
+ "probe": {
+ "id": "Microsoft.Network/applicationGateways/probes/existingAseName-waf/webAppProbe"
+ }
+ }
+ },
+ {
+ "name": "contentAppBackendHttpSettings",
+ "properties": {
+ "Port": 80,
+ "Protocol": "Http",
+ "CookieBasedAffinity": "Disabled",
+ "PickHostNameFromBackendAddress": false,
+ "probe": {
+ "id": "Microsoft.Network/applicationGateways/probes/existingAseName-waf/contentAppProbe"
+ }
+ }
+ },
+ {
+ "name": "adminAppBackendHttpSettings",
+ "properties": {
+ "Port": 80,
+ "Protocol": "Http",
+ "CookieBasedAffinity": "Disabled",
+ "PickHostNameFromBackendAddress": false,
+ "probe": {
+ "id": "Microsoft.Network/applicationGateways/probes/existingAseName-waf/adminAppProbe"
+ }
+ }
+ }
+ ],
+ "httpListeners": [
+ {
+ "name": "webAppHttpListener",
+ "properties": {
+ "FrontendIPConfiguration": {
+ "id": "Microsoft.Network/applicationGateways/frontendIPConfigurations/existingAseName-waf/appGatewayFrontendIP"
+ },
+ "FrontendPort": {
+ "id": "Microsoft.Network/applicationGateways/frontendPorts/existingAseName-waf/appGatewayFrontendPort"
+ },
+ "Protocol": "Http",
+ "HostName": "existingAseName-web.contoso.com"
+ }
+ },
+ {
+ "name": "contentAppHttpListener",
+ "properties": {
+ "FrontendIPConfiguration": {
+ "id": "Microsoft.Network/applicationGateways/frontendIPConfigurations/existingAseName-waf/appGatewayFrontendIP"
+ },
+ "FrontendPort": {
+ "id": "Microsoft.Network/applicationGateways/frontendPorts/existingAseName-waf/appGatewayFrontendPort"
+ },
+ "Protocol": "Http",
+ "HostName": "existingAseName-content.contoso.com"
+ }
+ },
+ {
+ "name": "adminAppHttpListener",
+ "properties": {
+ "FrontendIPConfiguration": {
+ "id": "Microsoft.Network/applicationGateways/frontendIPConfigurations/existingAseName-waf/appGatewayFrontendIP"
+ },
+ "FrontendPort": {
+ "id": "Microsoft.Network/applicationGateways/frontendPorts/existingAseName-waf/appGatewayFrontendPort"
+ },
+ "Protocol": "Http",
+ "HostName": "existingAseName-admin.contoso.com"
+ }
+ }
+ ],
+ "requestRoutingRules": [
+ {
+ "Name": "webAppRule",
+ "properties": {
+ "RuleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners/existingAseName-waf/webAppHttpListener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools/existingAseName-waf/webAppBackendPool"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection/existingAseName-waf/webAppBackendHttpSettings"
+ }
+ }
+ },
+ {
+ "Name": "contentAppRule",
+ "properties": {
+ "RuleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners/existingAseName-waf/contentAppHttpListener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools/existingAseName-waf/contentAppBackendPool"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection/existingAseName-waf/contentAppBackendHttpSettings"
+ }
+ }
+ },
+ {
+ "Name": "adminAppRule",
+ "properties": {
+ "RuleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners/existingAseName-waf/adminAppHttpListener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools/existingAseName-waf/adminAppBackendPool"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection/existingAseName-waf/adminAppBackendHttpSettings"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "webAppProbe",
+ "properties": {
+ "protocol": "Http",
+ "path": "/",
+ "host": "existingAseName-web.internal-contoso.com",
+ "interval": 30,
+ "timeout": 120,
+ "unhealthyThreshold": 3,
+ "pickHostNameFromBackendHttpSettings": false
+ }
+ },
+ {
+ "name": "contentAppProbe",
+ "properties": {
+ "protocol": "Http",
+ "path": "/",
+ "host": "existingAseName-content.internal-contoso.com",
+ "interval": 30,
+ "timeout": 120,
+ "unhealthyThreshold": 3,
+ "pickHostNameFromBackendHttpSettings": false
+ }
+ },
+ {
+ "name": "adminAppProbe",
+ "properties": {
+ "protocol": "Http",
+ "path": "/",
+ "host": "existingAseName-admin.internal-contoso.com",
+ "interval": 30,
+ "timeout": 120,
+ "unhealthyThreshold": 3,
+ "pickHostNameFromBackendHttpSettings": false
+ }
+ }
+ ],
+ "webApplicationFirewallConfiguration": {
+ "enabled": true,
+ "firewallMode": "Prevention",
+ "ruleSetType": "OWASP",
+ "ruleSetVersion": "3.0",
+ "disabledRuleGroups": [
+ {
+ "ruleGroupName": "REQUEST-920-PROTOCOL-ENFORCEMENT",
+ "rules": [
+ 920350
+ ]
+ },
+ {
+ "ruleGroupName": "REQUEST-931-APPLICATION-ATTACK-RFI",
+ "rules": [
+ 931130
+ ]
+ },
+ {
+ "ruleGroupName": "REQUEST-942-APPLICATION-ATTACK-SQLI",
+ "rules": [
+ 942130,
+ 942440
+ ]
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "existingAseName-waf-ip",
+ "location": "existingAseLocation",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "existingAseName-waf"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-09-01",
+ "type": "microsoft.cdn/profiles",
+ "name": "existingAseName-cdn",
+ "location": "existingAseLocation",
+ "sku": {
+ "name": "standard_verizon"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-09-01",
+ "type": "endpoints",
+ "name": "existingAseName-cdn-web",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "microsoft.cdn/profiles//existingAseName-cdn"
+ ],
+ "properties": {
+ "isHttpAllowed": true,
+ "isHttpsAllowed": false,
+ "origins": [
+ {
+ "name": "contentApp",
+ "properties": {
+ "hostName": "existingAseName-content.contoso.com"
+ }
+ }
+ ],
+ "isCompressionEnabled": true,
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "text/javascript",
+ "application/x-javascript",
+ "application/javascript",
+ "application/json",
+ "application/xml"
+ ],
+ "optimizationType": "GeneralWebDelivery",
+ "originHostHeader": "existingAseName-content.contoso.com"
+ }
+ },
+ {
+ "apiVersion": "2020-09-01",
+ "type": "endpoints",
+ "name": "existingAseName-cdn-storage",
+ "location": "existingAseLocation",
+ "dependsOn": [
+ "[resourceId('microsoft.cdn/profiles/', variables('cdnName'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]"
+ ],
+ "properties": {
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "origins": [
+ {
+ "name": "Storage",
+ "properties": {
+ "hostName": "[replace(replace(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2021-04-01').primaryEndpoints.blob, 'https://', ''), '/', '')]"
+ }
+ }
+ ],
+ "isCompressionEnabled": true,
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "text/javascript",
+ "application/x-javascript",
+ "application/javascript",
+ "application/json",
+ "application/xml"
+ ],
+ "optimizationType": "GeneralWebDelivery",
+ "originHostHeader": "[replace(replace(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2021-04-01').primaryEndpoints.blob, 'https://', ''), '/', '')]"
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "webAppURL": {
+ "type": "string",
+ "value": "[concat('http://', variables('webAppExternalHostName'))]"
+ },
+ "adminAppURL": {
+ "type": "string",
+ "value": "[concat('http://', variables('adminAppExternalHostName'))]"
+ },
+ "adminAppRedirectURL": {
+ "type": "string",
+ "value": "[concat('http://', variables('adminAppExternalHostName'), '/signin-oidc')]"
+ },
+ "appGatewayPublicIPFqdn": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses/', variables('appGatewayPublicIPName')), '2020-11-01').dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT71 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT71
new file mode 100644
index 0000000..86daa50
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT71
@@ -0,0 +1,243 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-vnetstorage.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "timestamp": 1642962885184,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/trendp2p-vnetstorage.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/nested/datameer-hdinsight.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT71",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT71",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "storage-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "value": "westus"
+ },
+ "network-api-version": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "dsmvnet"
+ },
+ "vnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet1Name": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet1Prefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet2Name": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet2Prefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet3Name": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet3Prefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet4Name": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "subnet4Prefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tagvalues": {
+ "type": "object",
+ "defaultValue": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "availabilitySetSettings": {
+ "type": "object",
+ "metadata": {
+ "description": "Availability Set settings object"
+ }
+ },
+ "datameerTags": {
+ "type": "object"
+ },
+ "trendmicroTags": {
+ "type": "object"
+ },
+ "chefSoftwareTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "clusterName": {
+ "value": "hdi-datameer-avyan-cluster"
+ },
+ "clusterType": {
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "value": "hdiadmin"
+ },
+ "clusterLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "value": "hdiuser"
+ },
+ "sshPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccount": {
+ "value": "stgmsignite2016"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "hdi-datameer-avyan-clustersubnet"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "",
+ "apiVersion": "2018-02-01",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "sku": {
+ "name": ""
+ },
+ "properties": {}
+ },
+ {
+ "apiVersion": "2017-06-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "dsmvnet",
+ "location": "westus",
+ "tags": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef",
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ ""
+ ]
+ },
+ "subnets": [
+ {
+ "name": "",
+ "properties": {
+ "addressPrefix": ""
+ }
+ },
+ {
+ "name": "",
+ "properties": {
+ "addressPrefix": ""
+ }
+ },
+ {
+ "name": "",
+ "properties": {
+ "addressPrefix": ""
+ }
+ },
+ {
+ "name": "",
+ "properties": {
+ "addressPrefix": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "availabilitySetSettingscopyindex()",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "datameerTags"
+ },
+ "copy": {
+ "name": "availabilitySetLoop",
+ "count": "availabilitySetSettings"
+ },
+ "location": "westus",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": "availabilitySetSettings",
+ "platformUpdateDomainCount": "availabilitySetSettings"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT710 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT710
new file mode 100644
index 0000000..a493ae2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT710
@@ -0,0 +1,226 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/eset-vm-extension/azuredeploy.json",
+ "/demos/eset-vm-extension/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899356,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/eset-vm-extension/azuredeploy.json",
+ "/demos/eset-vm-extension/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT710",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT710",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNameForPublicIP": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "myVM",
+ "metadata": {
+ "description": "Vitual machine's unique name."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Virtual machine size"
+ }
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "Windows-Server-Technical-Preview"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter, Windows-Server-Technical-Preview."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "diskStorageType": "StandardSSD_LRS",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP",
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "myVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "myVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "myVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "myVM/fileSecurityExtension",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//myVM"
+ ],
+ "properties": {
+ "publisher": "ESET",
+ "type": "FileSecurity",
+ "typeHandlerVersion": "6.5"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT711 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT711
new file mode 100644
index 0000000..9dbb90b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT711
@@ -0,0 +1,558 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/haproxy-redundant-floatingip-ubuntu/azuredeploy.json",
+ "/demos/haproxy-redundant-floatingip-ubuntu/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899372,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/haproxy-redundant-floatingip-ubuntu/azuredeploy.json",
+ "/demos/haproxy-redundant-floatingip-ubuntu/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT711",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT711",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sshKeyData": {
+ "type": "string",
+ "metadata": {
+ "description": "SSH rsa public key file as a string."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "lbDNSLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Label for the load balancer Public IP. Must be lowercase. It should match with the regex: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "haproxyVMNamePrefix": {
+ "type": "string",
+ "defaultValue": "haproxyvm-",
+ "metadata": {
+ "description": "Prefix to use for names of VMs under the load balancer"
+ }
+ },
+ "appVMNamePrefix": {
+ "type": "string",
+ "defaultValue": "appvm-",
+ "metadata": {
+ "description": "Prefix to use for names of application VMs"
+ }
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "14.04.5-LTS",
+ "allowedValues": [
+ "12.04.5-LTS",
+ "14.04.5-LTS",
+ "15.10"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values: 12.04.5-LTS, 14.04.5-LTS, 15.10."
+ },
+ "value": "14.04.5-LTS"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the VM"
+ },
+ "value": "Standard_D2_v3"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "location"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat(uniqueString(resourceGroup().id), 'haproxysa')]",
+ "numberOfHAproxyInstances": 2,
+ "haproxyVMScripts": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('haproxyvm-configure.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('keepalived-action.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('keepalived-check-appsvc.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sudo bash -x haproxyvm-configure.sh -a appvm-0 -a appvm-1 -p 80 -l GEN-UNIQUE.[resourceGroup().location].cloudapp.azure.com -t 80 -m haproxyvm-0 -b haproxyvm-1"
+ },
+ "numberOfAppInstances": 2,
+ "appVMScripts": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('apache-setup.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sudo bash apache-setup.sh"
+ },
+ "appVMPort": 80,
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "sshKeyPath": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "nicNamePrefix": "nic-",
+ "storageAccountType": "StandardSSD_LRS",
+ "haproxyAvailabilitySetName": "haproxyAvSet",
+ "appAvailabilitySetName": "appAvSet",
+ "vnetName": "haproxyVNet",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet-1",
+ "subnetPrefix": "10.0.0.0/24",
+ "lbName": "haproxyLB",
+ "lbPublicIPAddressType": "Static",
+ "lbPublicIPAddressName": "haproxyLB-publicip",
+ "lbVIPPort": 80
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "StandardSSD_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "haproxyAvSet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "PlatformUpdateDomainCount": 3,
+ "PlatformFaultDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "appAvSet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "PlatformUpdateDomainCount": 3,
+ "PlatformFaultDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "haproxyLB-publicip",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "haproxyVNet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "name": "haproxyLB",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//haproxyLB-publicip"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/haproxyLB-publicip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "BackendPool1"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "SSH-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/haproxyLB/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50001,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "SSH-VM1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/haproxyLB/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50002,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "LBRule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/haproxyLB/LoadBalancerFrontEnd"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/haproxyLB/BackendPool1"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "enableFloatingIP": true,
+ "idleTimeoutInMinutes": 5,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/haproxyLB/tcpProbe"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "tcpProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "haproxyvm-nic-copyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "haproxyNicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//haproxyVNet",
+ "Microsoft.Network/loadBalancers//haproxyLB"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/haproxyVNet/variables (subnetName)"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/haproxyLB/BackendPool1"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/haproxyLB/SSH-VMcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "haproxyvm-copyindex()",
+ "copy": {
+ "name": "haproxyVMLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', concat(parameters('haproxyVMNamePrefix'), variables('nicNamePrefix'), copyindex()))]",
+ "[resourceId('Microsoft.Compute/availabilitySets/', variables('haproxyAvailabilitySetName'))]"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/haproxyAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "haproxyvm-copyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "haproxyvm-OSDisk-copyindex()",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/haproxyvm-nic-copyindex()"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2021-01-01').primaryEndpoints.blob)]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "appvm-nic-copyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "appNicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//haproxyVNet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/haproxyVNet/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "appvm-copyindex()",
+ "copy": {
+ "name": "appVMLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', concat(parameters('appVMNamePrefix'), variables('nicNamePrefix'), copyindex()))]",
+ "[resourceId('Microsoft.Compute/availabilitySets/', variables('appAvailabilitySetName'))]"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/appAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "appvm-copyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "appvm-OSDisk-copyindex()",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/appvm-nic-copyindex()"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2021-01-01').primaryEndpoints.blob)]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "appvm-copyindex()/configureappvm",
+ "copy": {
+ "name": "appVMExtensionsLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//appvm-copyindex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "(appVMScripts).fileUris"
+ },
+ "protectedSettings": {
+ "commandToExecute": "(appVMScripts).commandToExecute"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "haproxyvm-copyindex()/configureHAproxyVM",
+ "copy": {
+ "name": "haproxyVMExtensionsLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//haproxyvm-copyindex()",
+ "appVMExtensionsLoop"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "(haproxyVMScripts).fileUris",
+ "commandToExecute": "(haproxyVMScripts).commandToExecute"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT712 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT712
new file mode 100644
index 0000000..c3239d8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT712
@@ -0,0 +1,317 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/hdinsight-linux-run-script-action/azuredeploy.json",
+ "/demos/hdinsight-linux-run-script-action/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899384,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/hdinsight-linux-run-script-action/azuredeploy.json",
+ "/demos/hdinsight-linux-run-script-action/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT712",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.storage/storageaccounts",
+ "microsoft.hdinsight/clusters"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT712",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "clusterVNetAddressSpace": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "The virtual network's address range in CIDR notion. It must be contained in one of the standard private address spaces: 10.0.0.0/8, 172.160.0.0/12, or 192.168.0.0/16."
+ }
+ },
+ "clusterVNetSubnetName": {
+ "type": "string",
+ "defaultValue": "default",
+ "metadata": {
+ "description": "The name of the subnet to create in the virtual network."
+ }
+ },
+ "clusterVNetSubnetAddressRange": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "The subnet's address range in CIDR notation. It must be contained by the address space of the virtual network."
+ }
+ },
+ "clusterName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the HDInsight cluster to create."
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "clusterType": {
+ "type": "string",
+ "defaultValue": "hadoop",
+ "allowedValues": [
+ "hadoop",
+ "hbase"
+ ],
+ "metadata": {
+ "description": "The type of HDInsight cluster to create."
+ },
+ "value": "hadoop"
+ },
+ "clusterLoginUserName": {
+ "type": "string",
+ "metadata": {
+ "description": "These credentials can be used to submit jobs to the cluster and to log into cluster dashboards."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "clusterLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sshUserName": {
+ "type": "string",
+ "metadata": {
+ "description": "These credentials can be used to remotely access the cluster and the edge node virtual machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sshPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "clusterStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the storage account to be created and be used as the cluster's storage."
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "clusterWorkerNodeCount": {
+ "type": "int",
+ "defaultValue": 4,
+ "metadata": {
+ "description": "The number of nodes in the HDInsight cluster."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "scriptActionUri": {
+ "type": "string",
+ "defaultValue": "[uri(parameters('_artifactsLocation'), concat('setEnvVar.sh', parameters('_artifactsLocationSasToken')))]",
+ "metadata": {
+ "description": "A public http(s) uri that points to a script action which will set an environment variable on each node."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "clusterNodeSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4_v3",
+ "allowedValues": [
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D16_v3"
+ ],
+ "metadata": {
+ "description": "All nodes will be deployed using the specified hardware profile: D12(4 CPU Cores, 28GB of RAM), D13(8 CPU Cores, 56GB of RAM), D14(16 CPU Cores, 112 GB of RAM)."
+ }
+ }
+ },
+ "variables": {
+ "defaultApiVersion": "2015-05-01-preview",
+ "clusterVNetName": "GEN-UNIQUE-10-vnet"
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-10-vnet",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "default",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.Storage/storageAccounts",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-02-01",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.HDInsight/clusters",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2018-06-01-preview",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE-10",
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-10-vnet"
+ ],
+ "properties": {
+ "clusterVersion": "3.6",
+ "osType": "Linux",
+ "clusterDefinition": {
+ "kind": "hadoop",
+ "configurations": {
+ "gateway": {
+ "restAuthCredential.isEnabled": true,
+ "restAuthCredential.username": "GEN-UNIQUE",
+ "restAuthCredential.password": "GEN-PASSWORD"
+ }
+ }
+ },
+ "storageProfile": {
+ "storageaccounts": [
+ {
+ "name": "[replace(replace(concat(reference(resourceId('Microsoft.Storage/storageAccounts/', parameters('clusterStorageAccountName')), '2020-08-01-preview').primaryEndpoints.blob),'https:',''),'/','')]",
+ "isDefault": true,
+ "container": "GEN-UNIQUE-10",
+ "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('clusterStorageAccountName')), variables('defaultApiVersion')).key1]"
+ }
+ ]
+ },
+ "computeProfile": {
+ "roles": [
+ {
+ "name": "headnode",
+ "targetInstanceCount": 2,
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "linuxOperatingSystemProfile": {
+ "username": "GEN-UNIQUE",
+ "password": "GEN-PASSWORD"
+ }
+ },
+ "virtualNetworkProfile": {
+ "id": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10-vnet",
+ "subnet": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10-vnet/subnets/default"
+ },
+ "scriptActions": [
+ {
+ "name": "setenvironmentvariableHeadNode",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('setEnvVar.sh', parameters('_artifactsLocationSasToken')))]",
+ "parameters": "headnode"
+ }
+ ]
+ },
+ {
+ "name": "workernode",
+ "targetInstanceCount": 4,
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "linuxOperatingSystemProfile": {
+ "username": "GEN-UNIQUE",
+ "password": "GEN-PASSWORD"
+ }
+ },
+ "virtualNetworkProfile": {
+ "id": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10-vnet",
+ "subnet": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10-vnet/subnets/default"
+ },
+ "scriptActions": [
+ {
+ "name": "setenvironmentvariableWorkerNode",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('setEnvVar.sh', parameters('_artifactsLocationSasToken')))]",
+ "parameters": "workernode"
+ }
+ ]
+ },
+ {
+ "name": "zookeepernode",
+ "targetInstanceCount": 3,
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "linuxOperatingSystemProfile": {
+ "username": "GEN-UNIQUE",
+ "password": "GEN-PASSWORD"
+ }
+ },
+ "virtualNetworkProfile": {
+ "id": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10-vnet",
+ "subnet": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10-vnet/subnets/default"
+ },
+ "scriptActions": [
+ {
+ "name": "setenvironmentvariableZookeeperNode",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('setEnvVar.sh', parameters('_artifactsLocationSasToken')))]",
+ "parameters": "zookeepernode"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vnet": {
+ "type": "object",
+ "value": "[reference(resourceId('Microsoft.Network/virtualNetworks',variables('clusterVNetName')))]"
+ },
+ "cluster": {
+ "type": "object",
+ "value": "[reference(resourceId('Microsoft.HDInsight/clusters',parameters('clusterName')))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT713 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT713
new file mode 100644
index 0000000..4ded2ed
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT713
@@ -0,0 +1,769 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/hub-and-spoke-sandbox/azuredeploy.json",
+ "/demos/hub-and-spoke-sandbox/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899399,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/hub-and-spoke-sandbox/azuredeploy.json",
+ "/demos/hub-and-spoke-sandbox/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT713",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.network/virtualnetworkgateways",
+ "microsoft.network/virtualnetworks/virtualnetworkpeerings",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts",
+ "microsoft.network/virtualnetworks/subnets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT713",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2016-Datacenter",
+ "metadata": {
+ "description": "The Windows version for Windows Jump-host VM."
+ }
+ },
+ "winVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4_v3",
+ "metadata": {
+ "description": "Size for Windows jump-host VM"
+ }
+ },
+ "winVmUser": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for Windows jump-host VM"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "winVmPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for Windows jump-host VM. The password must be between 6-72 characters long and must satisfy at least 3 of password complexity requirements from the following: 1) Contains an uppercase character 2) Contains a lowercase character 3) Contains a numeric digit 4) Contains a special character 5) Control characters are not allowed"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "winVmDnsPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Label for Windows jump-host VM."
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "deployVpnGateway": {
+ "type": "string",
+ "defaultValue": "No",
+ "allowedValues": [
+ "Yes",
+ "No"
+ ],
+ "metadata": {
+ "description": "Whether or not to deploy a VPN Gateway in the Hub"
+ },
+ "value": "Yes"
+ },
+ "gatewaySku": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "allowedValues": [
+ "Basic",
+ "VpnGw1",
+ "VpnGw2",
+ "VpnGw3"
+ ],
+ "metadata": {
+ "description": "The SKU of the Gateway, if deployed"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "hubVnetName": "hubVnet",
+ "hubVnetPrefix": "192.168.0.0/20",
+ "dmzSubnetName": "DMZSubnet",
+ "dmzSubnetPrefix": "192.168.0.0/25",
+ "mgmtSubnetName": "ManagementSubnet",
+ "mgmtSubnetPrefix": "192.168.1.0/24",
+ "sharedSubnetName": "SharedSubnet",
+ "sharedSubnetPrefix": "192.168.4.0/22",
+ "gatewaySubnetName": "GatewaySubnet",
+ "gatewaySubnetPrefix": "192.168.15.224/27",
+ "gatewayName": "hubVpnGateway",
+ "gatewayPIPName": "hubVpnGatewayPublicIp",
+ "subnetGatewayId": "Microsoft.Network/virtualNetworks/subnets/hubVnet/GatewaySubnet",
+ "winJmphostName": "winJmphostVm",
+ "devSpokeVnetName": "spokeDevVnet",
+ "devSpokeVnetPrefix": "10.10.0.0/16",
+ "prodSpokeVnetName": "spokeProdVnet",
+ "prodSpokeVnetPrefix": "10.100.0.0/16",
+ "spokeWorkloadSubnetName": "WorkloadSubnet",
+ "devSpokeWorkloadSubnetPrefix": "10.10.0.0/16",
+ "prodSpokeWorkloadSubnetPrefix": "10.100.0.0/16",
+ "hubID": "Microsoft.Network/virtualNetworks//hubVnet",
+ "devSpokeID": "Microsoft.Network/virtualNetworks//spokeDevVnet",
+ "prodSpokeID": "Microsoft.Network/virtualNetworks//spokeProdVnet",
+ "winVmNicName": "winJmphostVmNIC",
+ "winVmStorageName": "[concat('hubwinvm',uniquestring(resourceGroup().id))]",
+ "winNsgName": "winJmpHostNsg",
+ "winJmphostPublicIpName": "winJmphostVmPublicIp"
+ },
+ "resources": [
+ {
+ "comments": "HUB Virtual Network (VNet)",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "hubVnet",
+ "apiVersion": "2019-11-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "192.168.0.0/20"
+ ]
+ },
+ "enableDdosProtection": false,
+ "enableVmProtection": false
+ }
+ },
+ {
+ "comments": "Management Subnet",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "hubVnet/ManagementSubnet",
+ "apiVersion": "2019-11-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet"
+ ],
+ "properties": {
+ "addressPrefix": "192.168.1.0/24"
+ }
+ },
+ {
+ "comments": "Shared Subnet",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "hubVnet/SharedSubnet",
+ "apiVersion": "2019-11-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet"
+ ],
+ "properties": {
+ "addressPrefix": "192.168.4.0/22"
+ }
+ },
+ {
+ "comments": "DMZ Subnet",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "hubVnet/DMZSubnet",
+ "apiVersion": "2019-11-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet"
+ ],
+ "properties": {
+ "addressPrefix": "192.168.0.0/25"
+ }
+ },
+ {
+ "condition": false,
+ "comments": "Gateway Subnet",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "hubVnet/GatewaySubnet",
+ "apiVersion": "2019-11-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet"
+ ],
+ "properties": {
+ "addressPrefix": "192.168.15.224/27"
+ }
+ },
+ {
+ "comments": "Development Spoke Virtual Network (VNet)",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "spokeDevVnet",
+ "apiVersion": "2019-11-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.10.0.0/16"
+ ]
+ },
+ "enableDdosProtection": false,
+ "enableVmProtection": false
+ }
+ },
+ {
+ "comments": "Development Workload Subnet",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "spokeDevVnet/WorkloadSubnet",
+ "apiVersion": "2019-11-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/spokeDevVnet"
+ ],
+ "properties": {
+ "addressPrefix": "10.10.0.0/16"
+ }
+ },
+ {
+ "comments": "Production Spoke Virtual Network (VNet)",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "spokeProdVnet",
+ "apiVersion": "2019-11-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.100.0.0/16"
+ ]
+ },
+ "enableDdosProtection": false,
+ "enableVmProtection": false
+ }
+ },
+ {
+ "comments": "Production Workload Subnet",
+ "type": "Microsoft.Network/virtualNetworks/subnets",
+ "name": "spokeProdVnet/WorkloadSubnet",
+ "apiVersion": "2019-11-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/spokeProdVnet"
+ ],
+ "properties": {
+ "addressPrefix": "10.100.0.0/16"
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "hubVnet/gwPeering_hubVnet_spokeDevVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/GatewaySubnet",
+ "Microsoft.Network/virtualNetworks/spokeDevVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeDevVnet/WorkloadSubnet"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": true,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//spokeDevVnet"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "hubVnet/peering_hubVnet_spokeDevVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/spokeDevVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeDevVnet/WorkloadSubnet"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//spokeDevVnet"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "hubVnet/gwPeering_hubVnet_spokeProdVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/GatewaySubnet",
+ "Microsoft.Network/virtualNetworks/spokeProdVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeProdVnet/WorkloadSubnet"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": true,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//spokeProdVnet"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "hubVnet/peering_hubVnet_spokeProdVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/spokeProdVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeProdVnet/WorkloadSubnet"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//spokeProdVnet"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "spokeDevVnet/gwPeering_spokeDevVnet_hubVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/GatewaySubnet",
+ "Microsoft.Network/virtualNetworks/spokeDevVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeDevVnet/WorkloadSubnet",
+ "Microsoft.Network/virtualNetworkGateways/hubVpnGateway"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": true,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//hubVnet"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "spokeDevVnet/peering_spokeDevVnet_hubVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/spokeDevVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeDevVnet/WorkloadSubnet"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//hubVnet"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "spokeProdVnet/gwPeering_spokeProdVnet_hubVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/GatewaySubnet",
+ "Microsoft.Network/virtualNetworks/spokeProdVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeProdVnet/WorkloadSubnet",
+ "Microsoft.Network/virtualNetworkGateways/hubVpnGateway"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": true,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//hubVnet"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "spokeProdVnet/peering_spokeProdVnet_hubVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/hubVnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/SharedSubnet",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/DMZSubnet",
+ "Microsoft.Network/virtualNetworks/spokeProdVnet",
+ "Microsoft.Network/virtualNetworks/subnets/spokeProdVnet/WorkloadSubnet"
+ ],
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks//hubVnet"
+ }
+ }
+ },
+ {
+ "comments": "Windows Jump-Hosts",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "winJmphostVm",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces', variables('winVmNicName'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('winVmStorageName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": 20,
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "osProfile": {
+ "computerName": "winJmphostVm",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "windowsConfiguration": {
+ "provisionVMAgent": true
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/winJmphostVmNIC"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('winVmStorageName'), '2019-06-01').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "Network Interface Card (NIC) for Win Jump-Host",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "winJmphostVmNIC",
+ "apiVersion": "2019-11-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/winJmphostVmPublicIp",
+ "Microsoft.Network/networkSecurityGroups/winJmpHostNsg",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "winJmpHostIpConfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/winJmphostVmPublicIp"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/hubVnet/ManagementSubnet"
+ },
+ "primary": true,
+ "privateIPAddressVersion": "IPv4"
+ }
+ }
+ ],
+ "enableAcceleratedNetworking": false,
+ "enableIPForwarding": false,
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/winJmpHostNsg"
+ },
+ "primary": true
+ }
+ },
+ {
+ "comments": "NSG For Windows Jump Host",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "winJmpHostNsg",
+ "apiVersion": "2019-11-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "NSG_RULE_INBOUND_RDP",
+ "properties": {
+ "description": "Allow inbound RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Inbound"
+ }
+ }
+ ],
+ "defaultSecurityRules": [
+ {
+ "name": "AllowVnetInBound",
+ "properties": {
+ "description": "Allow inbound traffic from all VMs in VNET",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 65000,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowAzureLoadBalancerInBound",
+ "properties": {
+ "description": "Allow inbound traffic from azure load balancer",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 65001,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "DenyAllInBound",
+ "properties": {
+ "description": "Deny all inbound traffic",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 65500,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowVnetOutBound",
+ "properties": {
+ "description": "Allow outbound traffic from all VMs to all VMs in VNET",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 65000,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "AllowInternetOutBound",
+ "properties": {
+ "description": "Allow outbound traffic from all VMs to Internet",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "Internet",
+ "access": "Allow",
+ "priority": 65001,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "DenyAllOutBound",
+ "properties": {
+ "description": "Deny all outbound traffic",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 65500,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "comments": "Public IP (PIP) for Windows JumpHost",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "sku": {
+ "name": "Basic",
+ "tier": "Regional"
+ },
+ "name": "winJmphostVmPublicIp",
+ "apiVersion": "2019-11-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAddressVersion": "IPv4",
+ "publicIPAllocationMethod": "Static",
+ "idleTimeoutInMinutes": 4,
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(parameters('winVmDnsPrefix'))]"
+ }
+ }
+ },
+ {
+ "comments": "Storage account for WIN VM",
+ "type": "Microsoft.Storage/storageAccounts",
+ "sku": {
+ "name": "Standard_GRS",
+ "tier": "Standard"
+ },
+ "kind": "Storage",
+ "name": "[variables('winVmStorageName')]",
+ "apiVersion": "2019-06-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "networkAcls": {
+ "bypass": "AzureServices",
+ "defaultAction": "Allow"
+ },
+ "supportsHttpsTrafficOnly": false,
+ "encryption": {
+ "services": {
+ "file": {
+ "enabled": true
+ },
+ "blob": {
+ "enabled": true
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "hubVpnGatewayPublicIp",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "condition": false,
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworkGateways",
+ "name": "hubVpnGateway",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/hubVpnGatewayPublicIp",
+ "Microsoft.Network/virtualNetworks/subnets/hubVnet/GatewaySubnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/hubVnet/GatewaySubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/hubVpnGatewayPublicIp"
+ }
+ },
+ "name": "vnetGatewayConfig"
+ }
+ ],
+ "sku": {
+ "name": "Basic",
+ "tier": "Basic"
+ },
+ "gatewayType": "Vpn",
+ "vpnType": "RouteBased",
+ "enableBgp": false
+ }
+ }
+ ],
+ "outputs": {
+ "Jumphost VM IP address": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses',variables('winJmphostPublicIpName'))).IpAddress]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT714 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT714
new file mode 100644
index 0000000..2ef1bc3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT714
@@ -0,0 +1,220 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/identitygovernance-entitlementmanagement-extensibility-sample-logicapp/azuredeploy.json",
+ "/demos/identitygovernance-entitlementmanagement-extensibility-sample-logicapp/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899410,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/identitygovernance-entitlementmanagement-extensibility-sample-logicapp/azuredeploy.json",
+ "/demos/identitygovernance-entitlementmanagement-extensibility-sample-logicapp/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT714",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT714",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "name": {
+ "type": "String",
+ "metadata": {
+ "Description": "Name of the Logicapp"
+ },
+ "value": "AzureAD-EntitlementManagement-Custom-Extension"
+ },
+ "location": {
+ "type": "String",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "Description": "Deployment location"
+ }
+ },
+ "catalogId": {
+ "type": "String",
+ "metadata": {
+ "Description": "Catalog Id from Entitlement Management"
+ },
+ "value": "GEN-GUID"
+ },
+ "resourceApplicationId": {
+ "type": "String",
+ "metadata": {
+ "Description": "Resource application Id from Entitlement Management"
+ },
+ "value": "GEN-GUID"
+ }
+ },
+ "variables": {
+ "catalogIdExpression": "@{triggerBody()?['CatalogId']}"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Logic/workflows",
+ "apiVersion": "2019-05-01",
+ "name": "AzureAD-EntitlementManagement-Custom-Extension",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "Purpose": "Azure AD Entitlement Management"
+ },
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {},
+ "triggers": {
+ "manual": {
+ "type": "Request",
+ "kind": "Http",
+ "inputs": {
+ "schema": {
+ "properties": {
+ "AccessPackageAssignmentId": {
+ "type": "string"
+ },
+ "AccessPackageAssignmentRequestId": {
+ "type": "string"
+ },
+ "AccessPackageId": {
+ "type": "string"
+ },
+ "AccessPackageName": {
+ "type": "string"
+ },
+ "AccessPackagePolicyId": {
+ "type": "string"
+ },
+ "AccessPackagePolicyName": {
+ "type": "string"
+ },
+ "CatalogId": {
+ "type": "string"
+ },
+ "CatalogName": {
+ "type": "string"
+ },
+ "ConnectedOrganizationName": {
+ "type": "string"
+ },
+ "Event": {
+ "type": "string"
+ },
+ "RequestCreatedDateTime": {
+ "type": "string"
+ },
+ "TargetEmail": {
+ "type": "string"
+ },
+ "TargetId": {
+ "type": "string"
+ },
+ "TargetDisplayName": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "operationOptions": "IncludeAuthorizationHeadersInOutputs"
+ }
+ },
+ "actions": {
+ "Condition": {
+ "actions": {
+ "Condition_2": {
+ "actions": {},
+ "expression": {
+ "and": [
+ {
+ "equals": [
+ "@triggerBody()?['Event']",
+ "CustomExtensionConnectionTest"
+ ]
+ }
+ ]
+ },
+ "runAfter": {},
+ "type": "If"
+ }
+ },
+ "expression": {
+ "and": [
+ {
+ "equals": [
+ "@{triggerBody()?['CatalogId']}",
+ "[trim(parameters('catalogId'))]"
+ ]
+ }
+ ]
+ },
+ "runAfter": {},
+ "type": "If"
+ }
+ },
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ },
+ "parameters": {},
+ "accessControl": {
+ "triggers": {
+ "openAuthenticationPolicies": {
+ "policies": {
+ "AzureADEntitlementManagementAuthPolicy": {
+ "type": "AAD",
+ "claims": [
+ {
+ "name": "iss",
+ "value": "[concat('https://sts.windows.net/', subscription().tenantId, '/')]"
+ },
+ {
+ "name": "aud",
+ "value": "[trim(parameters('resourceApplicationId'))]"
+ },
+ {
+ "name": "appid",
+ "value": "810dcf14-1858-4bf2-8134-4c369fa3235b"
+ }
+ ]
+ },
+ "AzureADEntitlementManagementAuthPolicyV2App": {
+ "type": "AAD",
+ "claims": [
+ {
+ "name": "iss",
+ "value": "[concat(environment().authentication.loginEndpoint, subscription().tenantId, '/v2.0')]"
+ },
+ {
+ "name": "aud",
+ "value": "[trim(parameters('resourceApplicationId'))]"
+ },
+ {
+ "name": "azp",
+ "value": "810dcf14-1858-4bf2-8134-4c369fa3235b"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT715 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT715
new file mode 100644
index 0000000..981d000
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT715
@@ -0,0 +1,633 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/iis-2vm-sql-1vm/azuredeploy.json",
+ "/demos/iis-2vm-sql-1vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899436,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/iis-2vm-sql-1vm/azuredeploy.json",
+ "/demos/iis-2vm-sql-1vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT715",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT715",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "envPrefixName": {
+ "type": "string",
+ "metadata": {
+ "description": "Prefix for the environment (2-5 characters)"
+ },
+ "defaultValue": "cust1",
+ "value": "GEN-UNIQUE-5"
+ },
+ "username": {
+ "type": "string",
+ "metadata": {
+ "description": "SQL IaaS VM local administrator username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "password": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SQL IaaS VM local administrator password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "webSrvVMSize": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_D2s_v3"
+ ],
+ "metadata": {
+ "description": "The size of the Web Server VMs Created"
+ },
+ "defaultValue": "Standard_D2s_v3"
+ },
+ "numberOfWebSrvs": {
+ "type": "int",
+ "metadata": {
+ "description": "Number of Web Servers"
+ },
+ "allowedValues": [
+ 1,
+ 2
+ ],
+ "defaultValue": 1
+ },
+ "sqlVMSize": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_D4s_v3"
+ ],
+ "metadata": {
+ "description": "The size of the SQL VM Created"
+ },
+ "defaultValue": "Standard_D4s_v3"
+ },
+ "diskType": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The type of the Storage Account created"
+ },
+ "defaultValue": "Premium_LRS"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "virtualNetworkName": "GEN-UNIQUE-5Vnet",
+ "addressPrefix": "10.0.0.0/16",
+ "feSubnetPrefix": "10.0.0.0/24",
+ "dbSubnetPrefix": "10.0.2.0/24",
+ "feNSGName": "feNsg",
+ "dbNSGName": "dbNsg",
+ "sqlSrvDBName": "GEN-UNIQUE-5sqlSrv14",
+ "sqlVmSize": "Standard_D4s_v3",
+ "sqlSrvDBNicName": "GEN-UNIQUE-5sqlSrv14Nic",
+ "sqlPublicIP": "GEN-UNIQUE-5SqlPip",
+ "sqlImagePublisher": "MicrosoftSQLServer",
+ "sqlImageOffer": "SQL2014SP2-WS2012R2",
+ "sqlImageSku": "Standard",
+ "webSrvName": "GEN-UNIQUE-5webSrv",
+ "webSrvVMSize": "Standard_D2s_v3",
+ "webSrvNicName": "GEN-UNIQUE-5webSrvNic",
+ "webSrvPublicIP": "GEN-UNIQUE-5websrvpip",
+ "webSrvAvailabilitySetName": "GEN-UNIQUE-5webSrvAS",
+ "webSrvNumbOfInstances": 1,
+ "webSrvDnsNameforLBIP": "[concat(toLower(variables('webSrvName')), 'lb')]",
+ "webLbName": "GEN-UNIQUE-5webSrvlb",
+ "vmExtensionName": "dscExtension",
+ "configurationFunction": "WebServerConfig.ps1\\WebServerConfig"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "feNsg",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "FrontEndNSG"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "rdp_rule",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "web_rule",
+ "properties": {
+ "description": "Allow WEB",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-07-01",
+ "name": "dbNsg",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "BackEndNSG"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Allow_FE",
+ "properties": {
+ "description": "Allow FE Subnet",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "1433",
+ "sourceAddressPrefix": "10.0.0.0/24",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "rdp_rule",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Block_FE",
+ "properties": {
+ "description": "Block App Subnet",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "10.0.0.0/24",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 121,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Block_Internet",
+ "properties": {
+ "description": "Block Internet",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "Internet",
+ "access": "Deny",
+ "priority": 200,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE-5Vnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups//feNsg",
+ "Microsoft.Network/networkSecurityGroups//dbNsg"
+ ],
+ "tags": {
+ "displayName": "VirtualNetwork"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "FESubnetName",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/feNsg"
+ }
+ }
+ },
+ {
+ "name": "DBSubnetName",
+ "properties": {
+ "addressPrefix": "10.0.2.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/dbNsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-5SqlPip",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "tags": {
+ "displayName": "SqlPIP"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "idleTimeoutInMinutes": 4
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-5sqlSrv14Nic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-5Vnet"
+ ],
+ "tags": {
+ "displayName": "SQLSrvDBNic"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5Vnet/DBSubnetName"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-5SqlPip"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-5sqlSrv14",
+ "type": "Microsoft.Compute/virtualMachines",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//GEN-UNIQUE-5sqlSrv14Nic",
+ "Microsoft.Network/publicIPAddresses//GEN-UNIQUE-5SqlPip"
+ ],
+ "tags": {
+ "displayName": "SQL-Svr-DB"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4s_v3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE-5sqlSrv14",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftSQLServer",
+ "offer": "SQL2014SP2-WS2012R2",
+ "sku": "Standard",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE-5sqlSrv14_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-5sqlSrv14Nic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "location": "[resourceGroup().location]",
+ "name": "GEN-UNIQUE-5webSrvAS",
+ "properties": {
+ "PlatformUpdateDomainCount": 20,
+ "PlatformFaultDomainCount": 2
+ },
+ "tags": {
+ "displayName": "WebSrvAvailabilitySet"
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-5websrvpip",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "tags": {
+ "displayName": "WebSrvPIP for LB"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "idleTimeoutInMinutes": 4,
+ "dnsSettings": {
+ "domainNameLabel": "[variables('webSrvDnsNameforLBIP')]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "name": "GEN-UNIQUE-5webSrvlb",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Web LB"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//GEN-UNIQUE-5websrvpip"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-5websrvpip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "BackendPool1"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "RDP-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/GEN-UNIQUE-5webSrvlb/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50001,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "RDP-VM1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/GEN-UNIQUE-5webSrvlb/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50002,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "LBRule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/GEN-UNIQUE-5webSrvlb/LoadBalancerFrontEnd"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5webSrvlb/BackendPool1"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 5,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5webSrvlb/tcpProbe"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "tcpProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-5webSrvNiccopyindex()",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "copy": {
+ "name": "nicLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE-5Vnet",
+ "Microsoft.Network/loadBalancers//GEN-UNIQUE-5webSrvlb"
+ ],
+ "tags": {
+ "displayName": "WebSrvNic"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5Vnet/FESubnetName"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5webSrvlb/BackendPool1"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/GEN-UNIQUE-5webSrvlb/RDP-VMcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-5webSrvcopyindex()",
+ "type": "Microsoft.Compute/virtualMachines",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "copy": {
+ "name": "webSrvMachineLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//GEN-UNIQUE-5webSrvNiccopyindex()",
+ "Microsoft.Compute/availabilitySets//GEN-UNIQUE-5webSrvAS"
+ ],
+ "tags": {
+ "displayName": "WebSrv"
+ },
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/GEN-UNIQUE-5webSrvAS"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE-5webSrvcopyindex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE-5webSrvcopyindex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-5webSrvNiccopyindex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-5webSrvcopyindex()/dscExtension",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "webSrvMachineLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE-5webSrvcopyindex()"
+ ],
+ "tags": {
+ "displayName": "VM Extensions"
+ },
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), concat('scripts/WebServerConfig.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "WebServerConfig.ps1\\WebServerConfig",
+ "wmfVersion": "4.0"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT716 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT716
new file mode 100644
index 0000000..8f6b22c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT716
@@ -0,0 +1,325 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/imagebuilder-windowsbaseline/azuredeploy.json",
+ "/demos/imagebuilder-windowsbaseline/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899450,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/imagebuilder-windowsbaseline/azuredeploy.json",
+ "/demos/imagebuilder-windowsbaseline/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT716",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.authorization/roleassignments",
+ "microsoft.compute/galleries",
+ "microsoft.compute/galleries/images",
+ "microsoft.resources/deploymentscripts",
+ "microsoft.virtualmachineimages/imagetemplates",
+ "microsoft.managedidentity/userassignedidentities",
+ "microsoft.authorization/roledefinitions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT716",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "secureString",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The Azure region where resources in the template should be deployed."
+ }
+ },
+ "customizerScriptName": {
+ "type": "string",
+ "defaultValue": "scripts/runScript.ps1",
+ "metadata": {
+ "description": "The name of the customizer script which will be executed during image build."
+ }
+ },
+ "templateIdentityName": {
+ "type": "string",
+ "defaultValue": "[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]",
+ "metadata": {
+ "description": "Name of the user-assigned managed identity used by Azure Image Builder template, and for triggering the Azure Image Builder build at the end of the deployment"
+ }
+ },
+ "templateIdentityRoleDefinitionName": {
+ "type": "string",
+ "defaultValue": "[guid(resourceGroup().id)]",
+ "metadata": {
+ "description": "Permissions to allow for the user-assigned managed identity."
+ }
+ },
+ "imageGalleryName": {
+ "type": "string",
+ "defaultValue": "[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]",
+ "metadata": {
+ "description": "Name of the new Azure Image Gallery resource."
+ }
+ },
+ "imageDefinitionProperties": {
+ "type": "object",
+ "defaultValue": {
+ "name": "Win2019_AzureWindowsBaseline_Definition",
+ "publisher": "AzureWindowsBaseline",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter"
+ },
+ "metadata": {
+ "description": "Detailed image information to set for the custom image produced by the Azure Image Builder build."
+ }
+ },
+ "imageTemplateName": {
+ "type": "string",
+ "defaultValue": "Win2019_AzureWindowsBaseline_Template",
+ "metadata": {
+ "description": "Name of the template to create in Azure Image Builder."
+ }
+ },
+ "runOutputName": {
+ "type": "string",
+ "defaultValue": "Win2019_AzureWindowsBaseline_CustomImage",
+ "metadata": {
+ "description": "Name of the custom iamge to create and distribute using Azure Image Builder."
+ }
+ },
+ "replicationRegions": {
+ "type": "array",
+ "defaultValue": [
+ "centralus",
+ "eastus2",
+ "westus2",
+ "northeurope",
+ "westeurope"
+ ],
+ "metadata": {
+ "description": "List the regions in Azure where you would like to replicate the custom image after it is created."
+ }
+ },
+ "forceUpdateTag": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "A unique string generated for each deployment, to make sure the script is always run."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "customizerScriptUri": "[uri(parameters('_artifactsLocation'), format('{0}{1}', parameters('customizerScriptName'), parameters('_artifactsLocationSasToken')))]",
+ "templateIdentityRoleAssignmentName": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('templateIdentityName')), resourceGroup().id, resourceId('Microsoft.Authorization/roleDefinitions', parameters('templateIdentityRoleDefinitionName')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "type": "Microsoft.Authorization/roleDefinitions",
+ "apiVersion": "2018-07-01",
+ "name": "[guid(resourceGroup().id)]",
+ "properties": {
+ "roleName": "[guid(resourceGroup().id)]",
+ "description": "Used for AIB template and ARM deployment script that runs AIB build",
+ "type": "customRole",
+ "isCustom": true,
+ "permissions": [
+ {
+ "actions": [
+ "Microsoft.Compute/galleries/read",
+ "Microsoft.Compute/galleries/images/read",
+ "Microsoft.Compute/galleries/images/versions/read",
+ "Microsoft.Compute/galleries/images/versions/write",
+ "Microsoft.Compute/images/read",
+ "Microsoft.Compute/images/write",
+ "Microsoft.Compute/images/delete",
+ "Microsoft.Storage/storageAccounts/blobServices/containers/read",
+ "Microsoft.Storage/storageAccounts/blobServices/containers/write",
+ "Microsoft.ContainerInstance/containerGroups/read",
+ "Microsoft.ContainerInstance/containerGroups/write",
+ "Microsoft.ContainerInstance/containerGroups/start/action",
+ "Microsoft.Resources/deployments/read",
+ "Microsoft.Resources/deploymentScripts/read",
+ "Microsoft.Resources/deploymentScripts/write",
+ "Microsoft.VirtualMachineImages/imageTemplates/run/action"
+ ]
+ }
+ ],
+ "assignableScopes": [
+ "[resourceGroup().id]"
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2021-04-01-preview",
+ "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('templateIdentityName')), resourceGroup().id, resourceId('Microsoft.Authorization/roleDefinitions', parameters('templateIdentityRoleDefinitionName')))]",
+ "properties": {
+ "roleDefinitionId": "Microsoft.Authorization/roleDefinitions/[guid(resourceGroup().id)]",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('templateIdentityName'))).principalId]",
+ "scope": "[resourceGroup().id]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]",
+ "Microsoft.Authorization/roleDefinitions/[guid(resourceGroup().id)]"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/galleries",
+ "apiVersion": "2020-09-30",
+ "name": "[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Compute/galleries/images",
+ "apiVersion": "2020-09-30",
+ "name": "[format('{0}/{1}', parameters('imageGalleryName'), parameters('imageDefinitionProperties').name)]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "osType": "Windows",
+ "osState": "Generalized",
+ "identifier": {
+ "publisher": "AzureWindowsBaseline",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter"
+ },
+ "recommended": {
+ "vCPUs": {
+ "min": 2,
+ "max": 8
+ },
+ "memory": {
+ "min": 16,
+ "max": 48
+ }
+ },
+ "hyperVGeneration": "V1"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/galleries/[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]"
+ ]
+ },
+ {
+ "type": "Microsoft.VirtualMachineImages/imageTemplates",
+ "apiVersion": "2020-02-14",
+ "name": "Win2019_AzureWindowsBaseline_Template",
+ "location": "[resourceGroup().location]",
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('templateIdentityName'))]": {}
+ }
+ },
+ "properties": {
+ "buildTimeoutInMinutes": 60,
+ "vmProfile": {
+ "vmSize": "Standard_D2_v3",
+ "osDiskSizeGB": 127
+ },
+ "source": {
+ "type": "PlatformImage",
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "customize": [
+ {
+ "type": "WindowsUpdate",
+ "searchCriteria": "IsInstalled=0",
+ "filters": [
+ "exclude:$_.Title -like '*Preview*'",
+ "include:$true"
+ ],
+ "updateLimit": 40
+ },
+ {
+ "type": "PowerShell",
+ "name": "AzureWindowsBaseline",
+ "runElevated": true,
+ "scriptUri": "[uri(parameters('_artifactsLocation'), format('{0}{1}', parameters('customizerScriptName'), parameters('_artifactsLocationSasToken')))]"
+ }
+ ],
+ "distribute": [
+ {
+ "type": "SharedImage",
+ "galleryImageId": "Microsoft.Compute/galleries/images/[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]/Win2019_AzureWindowsBaseline_Definition",
+ "runOutputName": "Win2019_AzureWindowsBaseline_CustomImage",
+ "replicationRegions": [
+ "centralus",
+ "eastus2",
+ "westus2",
+ "northeurope",
+ "westeurope"
+ ]
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Compute/galleries/images/[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]/Win2019_AzureWindowsBaseline_Definition",
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deploymentScripts",
+ "apiVersion": "2020-10-01",
+ "name": "Image_template_build",
+ "location": "[resourceGroup().location]",
+ "kind": "AzurePowerShell",
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('templateIdentityName'))]": {}
+ }
+ },
+ "properties": {
+ "forceUpdateTag": "[newGuid()]",
+ "azPowerShellVersion": "6.2",
+ "scriptContent": "[format('Invoke-AzResourceAction -ResourceName \"{0}\" -ResourceGroupName \"{1}\" -ResourceType \"Microsoft.VirtualMachineImages/imageTemplates\" -ApiVersion \"2020-02-14\" -Action Run -Force', parameters('imageTemplateName'), resourceGroup().name)]",
+ "timeout": "PT1H",
+ "cleanupPreference": "OnSuccess",
+ "retentionInterval": "P1D"
+ },
+ "dependsOn": [
+ "Microsoft.VirtualMachineImages/imageTemplates/Win2019_AzureWindowsBaseline_Template",
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[substring(format('ImageGallery_{0}', guid(resourceGroup().id)), 0, 21)]",
+ "Microsoft.Authorization/roleAssignments/[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('templateIdentityName')), resourceGroup().id, resourceId('Microsoft.Authorization/roleDefinitions', parameters('templateIdentityRoleDefinitionName')))]"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT717 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT717
new file mode 100644
index 0000000..4734e4e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT717
@@ -0,0 +1,259 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/integrationpatterns-messagerouter-logicapp/azuredeploy.json",
+ "/demos/integrationpatterns-messagerouter-logicapp/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899467,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/integrationpatterns-messagerouter-logicapp/azuredeploy.json",
+ "/demos/integrationpatterns-messagerouter-logicapp/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT717",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.logic/workflows"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT717",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "logicAppName": {
+ "type": "string",
+ "defaultValue": "MessageRouter",
+ "metadata": {
+ "description": "The name for the logic app."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Logic/workflows",
+ "name": "MessageRouter",
+ "apiVersion": "2019-05-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "state": "Enabled",
+ "definition": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {},
+ "triggers": {
+ "manual": {
+ "type": "Request",
+ "kind": "Http",
+ "inputs": {
+ "schema": {
+ "properties": {
+ "Address": {
+ "type": "string"
+ },
+ "City": {
+ "type": "string"
+ },
+ "Name": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "actions": {
+ "Initialize_variable": {
+ "type": "InitializeVariable",
+ "inputs": {
+ "variables": [
+ {
+ "name": "ResultURL",
+ "type": "string"
+ }
+ ]
+ }
+ },
+ "Response": {
+ "runAfter": {
+ "Switch": [
+ "Succeeded"
+ ]
+ },
+ "type": "Response",
+ "inputs": {
+ "body": {
+ "Response": "Message can be seen at @{variables('ResultURL')}"
+ },
+ "statusCode": 200
+ }
+ },
+ "Switch": {
+ "runAfter": {
+ "Initialize_variable": [
+ "Succeeded"
+ ]
+ },
+ "cases": {
+ "Amsterdam": {
+ "case": "Amsterdam",
+ "actions": {
+ "Send_To_Amsterdam": {
+ "type": "Http",
+ "inputs": {
+ "body": {
+ "description": "Uploaded from Logic Apps",
+ "files": {
+ "Amsterdam.txt": {
+ "content": "Name: @{triggerBody()?['Name']}\nAddress: @{triggerBody()?['Address']}\nCity: @{triggerBody()?['City']}"
+ }
+ },
+ "public": true
+ },
+ "method": "POST",
+ "uri": "https://api.github.com/gists"
+ }
+ },
+ "Set_Amsterdam_Result": {
+ "runAfter": {
+ "Send_To_Amsterdam": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "ResultURL",
+ "value": "@{body('Send_To_Amsterdam')?['html_url']}"
+ }
+ }
+ }
+ },
+ "New_York": {
+ "case": "New York",
+ "actions": {
+ "Send_To_New_York": {
+ "type": "Http",
+ "inputs": {
+ "body": {
+ "description": "Uploaded from Logic Apps",
+ "files": {
+ "New York.txt": {
+ "content": "Name: @{triggerBody()?['Name']}\nAddress: @{triggerBody()?['Address']}\nCity: @{triggerBody()?['City']}"
+ }
+ },
+ "public": true
+ },
+ "method": "POST",
+ "uri": "https://api.github.com/gists"
+ }
+ },
+ "Set_New_York_Result": {
+ "runAfter": {
+ "Send_To_New_York": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "ResultURL",
+ "value": "@{body('Send_To_New_York')?['html_url']}"
+ }
+ }
+ }
+ },
+ "Paris": {
+ "case": "Paris",
+ "actions": {
+ "Send_To_Paris": {
+ "type": "Http",
+ "inputs": {
+ "body": {
+ "description": "Uploaded from Logic Apps",
+ "files": {
+ "Paris.txt": {
+ "content": "Name: @{triggerBody()?['Name']}\nAddress: @{triggerBody()?['Address']}\nCity: @{triggerBody()?['City']}"
+ }
+ },
+ "public": true
+ },
+ "method": "POST",
+ "uri": "https://api.github.com/gists"
+ }
+ },
+ "Set_Paris_Result": {
+ "runAfter": {
+ "Send_To_Paris": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "ResultURL",
+ "value": "@{body('Send_To_Paris')?['html_url']}"
+ }
+ }
+ }
+ }
+ },
+ "default": {
+ "actions": {
+ "Send_To_Other_Cities": {
+ "type": "Http",
+ "inputs": {
+ "body": {
+ "description": "Uploaded from Logic Apps",
+ "files": {
+ "Other Cities.txt": {
+ "content": "Name: @{triggerBody()?['Name']}\nAddress: @{triggerBody()?['Address']}\nCity: @{triggerBody()?['City']}"
+ }
+ },
+ "public": true
+ },
+ "method": "POST",
+ "uri": "https://api.github.com/gists"
+ }
+ },
+ "Set_Other_Cities_Result": {
+ "runAfter": {
+ "Send_To_Other_Cities": [
+ "Succeeded"
+ ]
+ },
+ "type": "SetVariable",
+ "inputs": {
+ "name": "ResultURL",
+ "value": "@{body('Send_To_Other_Cities')?['html_url']}"
+ }
+ }
+ }
+ },
+ "expression": "@triggerBody()?['City']",
+ "type": "Switch"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT718 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT718
new file mode 100644
index 0000000..5698cf2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT718
@@ -0,0 +1,236 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/integrationpatterns-messagerouter-servicebus/azuredeploy.json",
+ "/demos/integrationpatterns-messagerouter-servicebus/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899478,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/integrationpatterns-messagerouter-servicebus/azuredeploy.json",
+ "/demos/integrationpatterns-messagerouter-servicebus/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT718",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.servicebus/namespaces",
+ "microsoft.servicebus/namespaces/topics",
+ "microsoft.servicebus/namespaces/topics/subscriptions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT718",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "IncomingDeliveryRequestsTopicname": {
+ "type": "string",
+ "defaultValue": "incomingdeliveryrequests",
+ "metadata": {
+ "description": "The name for the Service Bus Topic."
+ }
+ },
+ "MessageRouterServiceBusnamespacePrefix": {
+ "type": "string",
+ "defaultValue": "MessageRouterServiceBus",
+ "metadata": {
+ "description": "The prefix of the name for the Service Bus namespace, will be appended with a unique string."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "serviceBusnamespacename": "[concat(parameters('MessageRouterServiceBusnamespacePrefix'), '-', uniquestring(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ServiceBus/namespaces",
+ "apiVersion": "2018-01-01-preview",
+ "name": "[variables('serviceBusnamespacename')]",
+ "location": "[resourceGroup().location]",
+ "kind": "Messaging",
+ "sku": {
+ "name": "Standard",
+ "capacity": 1,
+ "tier": "Standard"
+ }
+ },
+ {
+ "type": "Microsoft.ServiceBus/namespaces/topics",
+ "apiVersion": "2015-08-01",
+ "name": "[concat(variables('serviceBusnamespacename'), '/', parameters('IncomingDeliveryRequestsTopicname'))]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusnamespacename'))]"
+ ],
+ "properties": {
+ "defaultMessageTimeToLive": "14.00:00:00",
+ "enableBatchedOperations": false,
+ "enableExpress": false,
+ "enablePartitioning": true,
+ "enableSubscriptionPartitioning": false,
+ "filteringMessagesBeforePublishing": false,
+ "isAnonymousAccessible": false,
+ "isExpress": false,
+ "maxSizeInMegabytes": 1024,
+ "requiresDuplicateDetection": false,
+ "sizeInBytes": 0,
+ "supportOrdering": false
+ }
+ },
+ {
+ "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions",
+ "apiVersion": "2015-08-01",
+ "name": "[concat(variables('serviceBusnamespacename'), '/', parameters('IncomingDeliveryRequestsTopicname'), '/HighPriority')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusnamespacename'))]",
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'))]"
+ ],
+ "properties": {
+ "deadLetteringOnFilterEvaluationExceptions": false,
+ "deadLetteringOnMessageExpiration": true,
+ "defaultMessageTimeToLive": "14.00:00:00",
+ "enableBatchedOperations": false,
+ "lockDuration": "00:00:30",
+ "maxDeliveryCount": 10,
+ "requiresSession": false
+ },
+ "resources": [
+ {
+ "type": "Rules",
+ "apiVersion": "2015-08-01",
+ "name": "HighPriority",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics/subscriptions', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'), 'HighPriority')]"
+ ],
+ "properties": {
+ "filter": {
+ "sqlExpression": "Priority='High'"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions",
+ "apiVersion": "2015-08-01",
+ "name": "[concat(variables('serviceBusnamespacename'), '/', parameters('IncomingDeliveryRequestsTopicname'), '/Log')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusnamespacename'))]",
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'))]"
+ ],
+ "properties": {
+ "deadLetteringOnFilterEvaluationExceptions": false,
+ "deadLetteringOnMessageExpiration": true,
+ "defaultMessageTimeToLive": "14.00:00:00",
+ "enableBatchedOperations": false,
+ "lockDuration": "00:00:30",
+ "maxDeliveryCount": 10,
+ "requiresSession": false
+ },
+ "resources": [
+ {
+ "type": "Rules",
+ "apiVersion": "2015-08-01",
+ "name": "LogAll",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics/subscriptions', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'), 'Log')]"
+ ],
+ "properties": {
+ "filter": {
+ "sqlExpression": "1=1"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions",
+ "apiVersion": "2015-08-01",
+ "name": "[concat(variables('serviceBusnamespacename'), '/', parameters('IncomingDeliveryRequestsTopicname'), '/LowPriority')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusnamespacename'))]",
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'))]"
+ ],
+ "properties": {
+ "deadLetteringOnFilterEvaluationExceptions": false,
+ "deadLetteringOnMessageExpiration": true,
+ "defaultMessageTimeToLive": "14.00:00:00",
+ "enableBatchedOperations": false,
+ "lockDuration": "00:00:30",
+ "maxDeliveryCount": 10,
+ "requiresSession": false
+ },
+ "resources": [
+ {
+ "type": "Rules",
+ "apiVersion": "2015-08-01",
+ "name": "LowPriority",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics/subscriptions', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'), 'LowPriority')]"
+ ],
+ "properties": {
+ "filter": {
+ "sqlExpression": "Priority='Low'"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions",
+ "apiVersion": "2015-08-01",
+ "name": "[concat(variables('serviceBusnamespacename'), '/', parameters('IncomingDeliveryRequestsTopicname'), '/NormalPriority')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusnamespacename'))]",
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'))]"
+ ],
+ "properties": {
+ "deadLetteringOnFilterEvaluationExceptions": false,
+ "deadLetteringOnMessageExpiration": true,
+ "defaultMessageTimeToLive": "14.00:00:00",
+ "enableBatchedOperations": false,
+ "lockDuration": "00:00:30",
+ "maxDeliveryCount": 10,
+ "requiresSession": false
+ },
+ "resources": [
+ {
+ "type": "Rules",
+ "apiVersion": "2015-08-01",
+ "name": "NormalPriority",
+ "dependsOn": [
+ "[resourceId('Microsoft.ServiceBus/namespaces/topics/subscriptions', variables('serviceBusnamespacename'), parameters('IncomingDeliveryRequestsTopicname'), 'NormalPriority')]"
+ ],
+ "properties": {
+ "filter": {
+ "sqlExpression": "Priority='Normal'"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT719 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT719
new file mode 100644
index 0000000..60aa97a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT719
@@ -0,0 +1,431 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ipv6-in-vnet/azuredeploy.json",
+ "/demos/ipv6-in-vnet/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899503,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ipv6-in-vnet/azuredeploy.json",
+ "/demos/ipv6-in-vnet/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT719",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets",
+ "microsoft.network/routetables"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT719",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the administrator of the new VM. Exclusion list: 'admin','administrator'"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the administrator account of the new VM"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1_v2",
+ "metadata": {
+ "description": "description"
+ }
+ }
+ },
+ "variables": {
+ "vnetv4AddressRange": "10.0.0.0/16",
+ "vnetv6AddressRange": "ace:cab:deca::/48",
+ "subnetv4AddressRange": "10.0.0.0/24",
+ "subnetv6AddressRange": "ace:cab:deca:deed::/64",
+ "subnetName": "DualStackSubnet",
+ "newStorageAccountName": "[concat('st', uniqueString(resourceGroup().id))]",
+ "availabilitySetName": "myavset",
+ "subnet-id": "Microsoft.Network/virtualNetworks/subnets/VNET/DualStackSubnet",
+ "numberOfInstances": 2,
+ "vmName": "DsVM",
+ "publicipName": "RDPpublicIp",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "imageSku": "2019-Datacenter"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "RDPpublicIpcopyindex()",
+ "copy": {
+ "name": "publicIpLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "lbpublicip",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "lbpublicip-v6",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "publicIPAddressVersion": "IPv6"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myavset",
+ "apiVersion": "2020-06-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": "2",
+ "platformUpdateDomainCount": "5"
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2019-06-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('newStorageAccountName')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "name": "loadBalancer",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/lbpublicip",
+ "Microsoft.Network/publicIPAddresses/lbpublicip-v6"
+ ],
+ "properties": {
+ "frontendIpConfigurations": [
+ {
+ "name": "LBFE",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/lbpublicip"
+ }
+ }
+ },
+ {
+ "name": "LBFE-v6",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/lbpublicip-v6"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LBBAP"
+ },
+ {
+ "name": "LBBAP-v6"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/loadBalancer/LBFE"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "idleTimeoutInMinutes": 15
+ },
+ "name": "lbrule"
+ },
+ {
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/loadBalancer/LBFE-v6"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP-v6"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80
+ },
+ "name": "lbrule-v6"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "VNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16",
+ "ace:cab:deca::/48"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "DualStackSubnet",
+ "properties": {
+ "addressPrefixes": [
+ "10.0.0.0/24",
+ "ace:cab:deca:deed::/64"
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "dsNsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "allow-HTTP-in",
+ "properties": {
+ "description": "Allow HTTP",
+ "protocol": "TCP",
+ "sourcePortRange": "80",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1001,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-all-out",
+ "properties": {
+ "description": "Allow out All",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1002,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "allow-RDP-in",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1003,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-MyIpv6App-out",
+ "properties": {
+ "description": "Allow My IPv6 App",
+ "protocol": "Tcp",
+ "sourcePortRange": "33819-33829",
+ "destinationPortRange": "5000-6000",
+ "sourceAddressPrefix": "ace:cab:deca:deed::/64",
+ "destinationAddressPrefixes": [
+ "cab:cab:aaaa:bbbb::/64",
+ "cab:cab:1111:2222::/64"
+ ],
+ "access": "Allow",
+ "priority": 1004,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/routeTables",
+ "name": "v6routeTable",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "routes": [
+ {
+ "name": "v6route",
+ "properties": {
+ "addressPrefix": "cab:cab::/96",
+ "nextHopType": "VirtualAppliance",
+ "nextHopIpAddress": "ace:cab:deca:f00d::1"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "DsVMcopyindex()",
+ "copy": {
+ "name": "netIntLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/VNET",
+ "Microsoft.Network/networkSecurityGroups/dsNsg",
+ "Microsoft.Network/loadBalancers/loadBalancer",
+ "publicIpLoop"
+ ],
+ "properties": {
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/dsNsg"
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig-v4",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "privateIPAddressVersion": "IPv4",
+ "primary": true,
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/RDPpublicIpcopyindex()"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/DualStackSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ }
+ ]
+ }
+ },
+ {
+ "name": "ipconfig-v6",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "privateIPAddressVersion": "IPv6",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/DualStackSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP-v6"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "DsVMcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts',variables('newStorageAccountName'))]",
+ "[resourceId('Microsoft.Compute/availabilitySets',variables('availabilitySetName'))]",
+ "netIntLoop"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myavset"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A1_v2"
+ },
+ "osProfile": {
+ "computerName": "DsVMcopyindex()",
+ "adminUsername": "adminUserName",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/DsVMcopyindex()"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT72 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT72
new file mode 100644
index 0000000..48df4a6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT72
@@ -0,0 +1,1478 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/azuredeploy.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885308,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/azuredeploy.json",
+ "/application-workloads/chef/datameer-trend-chef-riskanalysis/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT72",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT72",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "westus",
+ "allowedValues": [
+ "westus",
+ "eastus",
+ "centralus"
+ ],
+ "metadata": {
+ "description": "Location where all the resources deploy"
+ },
+ "value": "westus"
+ },
+ "hdiclusterType": {
+ "type": "string",
+ "defaultValue": "hadoop",
+ "allowedValues": [
+ "hadoop",
+ "hbase",
+ "storm",
+ "spark"
+ ],
+ "metadata": {
+ "description": "The type of the HDInsight cluster to create."
+ },
+ "value": "hadoop"
+ },
+ "hdiclusterName": {
+ "type": "string",
+ "defaultValue": "datameerhdi",
+ "metadata": {
+ "description": "The name of the HDInsight cluster to create."
+ },
+ "value": "datameerhdi"
+ },
+ "hdiclusterLoginUserName": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "These credentials can be used to submit jobs to the cluster and to log into cluster dashboards."
+ },
+ "value": "demo"
+ },
+ "hdiclusterLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password must be at least 8 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "hdisshUserName": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "These credentials can be used to remotely access the cluster."
+ },
+ "value": "demo"
+ },
+ "hdisshPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password must be at least 8 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "hdistorageAccount": {
+ "type": "string",
+ "defaultValue": "hadoopstgacc",
+ "metadata": {
+ "description": "The name of the storage account to use"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on all Linux Virtual Machines. SSH key is recommended."
+ }
+ },
+ "vmAdminNameTrendDSM": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager Virtual Machine admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrPublicKeyTrendDSM": {
+ "type": "securestring",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager Virtual Machine admin password or SSH public key. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmSizeTrendDSM": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "allowedValues": [
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D16_v3"
+ ],
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager Virtual Machine size"
+ },
+ "value": "Standard_D2_v3"
+ },
+ "dsmAdminName": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager application username (To login to Trend DSM from browser)"
+ },
+ "value": "demo"
+ },
+ "dsmAdminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager application password (To login to Trend DSM from browser)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dbName": {
+ "type": "string",
+ "defaultValue": "dsm",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager database name"
+ },
+ "value": "dsm"
+ },
+ "dbAdminName": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager database admin user"
+ },
+ "value": "demo"
+ },
+ "dbAdminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager database admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "publicIPDomainNameLabelTrendDSM": {
+ "type": "string",
+ "defaultValue": "publicdnstrenddsm",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager unique public DNS prefix"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "managerPortTrendDSM": {
+ "type": "string",
+ "defaultValue": "443",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager management port"
+ },
+ "value": "443"
+ },
+ "heartbeatPortTrendDSM": {
+ "type": "string",
+ "defaultValue": "4120",
+ "metadata": {
+ "description": "TrendMicro Deep Security Manager heartbeat port"
+ },
+ "value": "4120"
+ },
+ "vmAdminUsernameOrchServer": {
+ "defaultValue": "demo",
+ "type": "string",
+ "metadata": {
+ "description": "Orchestrator Server Virtual Machine admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrPublicKeyOrchServer": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Orchestrator Server Virtual Machine admin password or SSH public key. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "publicIPDomainNameLabelOrchServer": {
+ "defaultValue": "publicdnsorcserver",
+ "type": "string",
+ "metadata": {
+ "description": "Orchestrator Server unique public DNS prefix"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminUsernameChefServer": {
+ "defaultValue": "demo",
+ "type": "string",
+ "metadata": {
+ "description": "Chef Server Virtual Machine admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrPublicKeyChefServer": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Chef Server Virtual Machine admin password or SSH public key. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmSizeChefServer": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "allowedValues": [
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3"
+ ],
+ "metadata": {
+ "description": "Chef Server Virtual Machine size"
+ },
+ "value": "Standard_D2_v3"
+ },
+ "publicIPDomainNameLabelChefServer": {
+ "type": "string",
+ "defaultValue": "publicdnschefserver",
+ "metadata": {
+ "description": "Chef Server unique public DNS prefix"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "chefUserName": {
+ "type": "string",
+ "defaultValue": "chefuser",
+ "metadata": {
+ "description": "Chef user name"
+ },
+ "value": "chefuser"
+ },
+ "chefUserFirstName": {
+ "type": "string",
+ "defaultValue": "chef",
+ "metadata": {
+ "description": "Chef user first name"
+ },
+ "value": "chef"
+ },
+ "chefUserLastName": {
+ "type": "string",
+ "defaultValue": "user",
+ "metadata": {
+ "description": "Chef user last name"
+ },
+ "value": "user"
+ },
+ "chefUserEmail": {
+ "type": "string",
+ "defaultValue": "chef@noone.com",
+ "metadata": {
+ "description": "Chef user email"
+ },
+ "value": "chef@noone.com"
+ },
+ "chefUserPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Chef user password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "chefOrgShortName": {
+ "type": "string",
+ "defaultValue": "ct",
+ "metadata": {
+ "description": "Chef org short name"
+ },
+ "value": "ct"
+ },
+ "chefOrgFullName": {
+ "type": "string",
+ "defaultValue": "Chef Test Inc",
+ "metadata": {
+ "description": "Chef Org full name"
+ },
+ "value": "Chef Test Inc"
+ },
+ "adminUsernameChefWorkstation": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "Chef Workstation Virtual Machine admin username"
+ },
+ "value": "demo"
+ },
+ "adminPasswordChefWorkstation": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Chef Workstation Virtual Machine admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmSizeChefWorkstation": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "allowedValues": [
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3"
+ ],
+ "metadata": {
+ "description": "Chef Workstation Virtual Machine size"
+ },
+ "value": "Standard_D2_v3"
+ },
+ "publicIPDomainNameLabelChefWorkstation": {
+ "type": "string",
+ "defaultValue": "publicdnschefws",
+ "metadata": {
+ "description": "Chef Workstation unique public DNS prefix"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsernameDSAgentWindows": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "Windows Deep Security Agent Virtual Machine admin username"
+ },
+ "value": "demo"
+ },
+ "adminPasswordDSAgentWindows": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Windows Deep Security Agent Virtual Machine admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "publicIPDomainNameLabelDSAgentWindows": {
+ "type": "string",
+ "defaultValue": "dnsdsagwin",
+ "metadata": {
+ "description": "Windows Deep Security Agent unique public DNS prefix"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "windowsvmcount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "Count of Windows Deep Security Agents to deploy"
+ },
+ "value": 1
+ },
+ "adminUsernameDSAgent": {
+ "type": "string",
+ "defaultValue": "demo",
+ "metadata": {
+ "description": "Linux Deep Security Agent Virtual Machine admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPasswordOrPublicKeyDSAgent": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Linux Deep Security Agent Virtual Machine admin password or SSH public key. SSH key recommended"
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "publicIPDomainNameLabelDSAgent": {
+ "type": "string",
+ "defaultValue": "dnsdsaglinux",
+ "metadata": {
+ "description": "Linux Deep Security Agent unique public DNS prefix"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "linuxvmcount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "Count of Linux Deep Security Agents to deploy"
+ },
+ "value": 1
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Artifactslocation"
+ },
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/chef/datameer-trend-chef-riskanalysis/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Reserved for deploying using Visual Studio. Please keep it as an empty string"
+ }
+ }
+ },
+ "variables": {
+ "location": "westus",
+ "vmNameTrendDSM": "trendMicroDSM",
+ "vmNameChefServer": "chefServer",
+ "vmNameChefWorkstation": "chefWS",
+ "vmNameDSAWindows": "dsawindows",
+ "vmNameDSAgent": "dsalinux",
+ "vmNameOrchServer": "orchestratorServer",
+ "nicNameTrendDSM": "trendMicroDSM-nic",
+ "networkInterfaceNameChefServer": "chefServer-nic",
+ "networkInterfaceNameOrchServer": "orchestratorServer-nic",
+ "securityGroupNameTrendDSM": "trendMicroDSM-nic-nsg",
+ "networkSecurityGroupNameChefServer": "chefServer-nic-nsg",
+ "networkSecurityGroupNameOrchServer": "orchestratorServer-nic-nsg",
+ "virtualNetworkName": "datameerP2PVnet",
+ "vnetAddressPrefix": "10.7.0.0/16",
+ "subnet1Name": "trendMicroDSMsubnet",
+ "subnet1Prefix": "10.7.0.0/24",
+ "subnet2Name": "chefServersubnet",
+ "subnet2Prefix": "10.7.1.0/24",
+ "subnet3StartAddress": "10.7.2.5",
+ "subnet4Name": "vmsubnet",
+ "subnet4Prefix": "10.7.3.0/24",
+ "subnet3Name": "(datameerHDInsightCluster).clusterNamesubnet",
+ "subnet3Prefix": "10.7.4.0/24",
+ "publicIPAddressType": "Dynamic",
+ "publicIPAddressNameTrendDSM": "publicIPTrendDSM",
+ "publicIPAddressNameChefServer": "publicIPChefServer",
+ "vnetID": "Microsoft.Network/virtualNetworks/datameerP2PVnet",
+ "subnet1Ref": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/trendMicroDSMsubnet",
+ "subnet2Ref": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/chefServersubnet",
+ "subnet3Ref": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/(datameerHDInsightCluster).clusterNamesubnet",
+ "subnet4Ref": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/vmsubnet",
+ "storageAccountName": "[tolower(concat(trim(substring(concat(variables('vmNameTrendDSM'),' '),0,6)),uniquestring(resourceGroup().id)))]",
+ "storageAccountType": "Standard_LRS",
+ "vmStorageAccountContainerName": "vhds",
+ "newsqlServerName": "[tolower(concat(variables('vmNameTrendDSM'),uniquestring(resourceGroup().id),'-sql'))]",
+ "storage-api-version": "2015-06-15",
+ "deployment-api-version": "2015-11-01",
+ "deployment-api-version2": "2015-01-01",
+ "network-api-version": "2015-06-15",
+ "compute-api-version": "2015-06-15",
+ "automation-api-version": "2015-01-01-preview",
+ "automation-api-version2": "2015-10-31",
+ "publisherTrendDSM": "trendmicro",
+ "publisherChefServer": "chef-software",
+ "licenseMode": "10",
+ "databaseOption": "new",
+ "offerChoosedTrendDSM": "concat(offer, parameters(vmSizeTrendDSM))",
+ "offerChoosedChefServer": "concat(offer, parameters(vmSizeChefServer))",
+ "offerStandard_D2_v2": {
+ "vmSize": "Standard_D2_v3",
+ "vmSku": "dxxn25d2v2",
+ "product": "deep-security-vm"
+ },
+ "offerStandard_D3_v2": {
+ "vmSize": "Standard_D4_v3",
+ "vmSku": "dxxn50d3v2",
+ "product": "deep-security-vm"
+ },
+ "offerStandard_D4_v2": {
+ "vmSize": "Standard_D8_v3",
+ "vmSku": "dxxn100d4v2",
+ "product": "deep-security-vm"
+ },
+ "offerStandard_D5_v2": {
+ "vmSize": "Standard_D16_v3",
+ "vmSku": "dxxn200d5v2",
+ "product": "deep-security-vm"
+ },
+ "offerBYOL": {
+ "vmSize": "Standard_D2_v3",
+ "vmSku": "dxxnbyol",
+ "product": "deep-security-vm-byol"
+ },
+ "offerStandard_D2": {
+ "vmSize": "Standard_D2_v3",
+ "vmSku": "azure_marketplace_25",
+ "product": "chef-server"
+ },
+ "availabilitySetSettings": {
+ "name": "datameerP2PVnet-aset",
+ "count": 1,
+ "fdCount": 3,
+ "udCount": 5
+ },
+ "sshFrom": "0.0.0.0/0",
+ "forwardedDataFrom": "0.0.0.0/0",
+ "emptyTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/empty-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "availabilitySetCount": 1,
+ "imagePublisherWindows": "MicrosoftWindowsServer",
+ "imageOfferWindows": "WindowsServer",
+ "imagePublisherLinux": "Canonical",
+ "imageOfferLinux": "UbuntuServer",
+ "TenantIdentifier": "NA",
+ "TenantActivationPassword": "NA",
+ "tagvalues": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ },
+ "existingSQLServerName": "",
+ "networkExists": "new",
+ "ManagerAddress": "GEN-UNIQUE[uniquestring(resourceGroup().id)].westus.cloudapp.azure.com",
+ "udpPort": "5005",
+ "chefServerScriptUrl": "[uri(parameters('_artifactsLocation'), concat('scripts/chefserver.sh', parameters('_artifactsLocationSasToken')))]",
+ "chefprefix": "chef",
+ "vmSizeDSAWindows": "Standard_D2_v3",
+ "windowsOSVersion": "2012-R2-Datacenter",
+ "vmSizeDSAgent": "Standard_D2_v3",
+ "ubuntuOSVersion": "14.04.2-LTS",
+ "uniqueString": "[uniquestring(resourceGroup().id)]",
+ "keyName": "validatorkey",
+ "resourcegroupName": "[resourceGroup().name]",
+ "kmServerUrl": "GEN-UNIQUE[uniquestring(resourceGroup().id)].westus.cloudapp.azure.com",
+ "chef_node_name": "chefnodedsagent",
+ "chef_server_url": "https://GEN-UNIQUE[uniquestring(resourceGroup().id)].westus.cloudapp.azure.com/organizations/ct",
+ "validation_client_name": "ct-validator",
+ "validation_key_format": "base64encoded",
+ "runlist": "recipe[trendmicro]",
+ "vmSizeOrcServer": "Standard_D2_v3",
+ "orcServerubuntuOSVersion": "14.04.2-LTS",
+ "installOrchTemplateurl": "[uri(parameters('_artifactsLocation'), concat('nested/orchestrator-server-setup-trend.json', parameters('_artifactsLocationSasToken')))]",
+ "chefnodeCustomScripturl": "[uri(parameters('_artifactsLocation'), concat('scripts/p2pchefnodebootstrap.sh', parameters('_artifactsLocationSasToken')))]",
+ "vnetstorageSciptrul": "[uri(parameters('_artifactsLocation'), concat('nested/trendp2p-vnetstorage.json', parameters('_artifactsLocationSasToken')))]",
+ "datameerHDInsightCluster": {
+ "defaultApiVersion": "2015-05-01-preview",
+ "clusterName": "[tolower(concat(trim(substring(concat(parameters('hdiclusterName'),' '),0,6)),uniquestring(resourceGroup().id)))]",
+ "standaloneTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/datameer-hdinsight.json', parameters('_artifactsLocationSasToken')))]",
+ "clusterType": "hadoop",
+ "clusterLoginUserName": "demo",
+ "clusterLoginPassword": "GEN-PASSWORD",
+ "sshUserName": "demo",
+ "sshPassword": "GEN-PASSWORD",
+ "storageAccount": "[tolower(concat(trim(substring(concat(parameters('hdistorageAccount'),' '),0,6)),uniquestring(resourceGroup().id)))]"
+ },
+ "datameerTags": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ },
+ "trendmicroTags": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ },
+ "chefSoftwareTags": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ },
+ "quickstartTags": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ },
+ "resources": [
+ {
+ "comments": "Common",
+ "name": "vnetstorage",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/trendp2p-vnetstorage.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "storageAccountName": {
+ "value": "[tolower(concat(trim(substring(concat(variables('vmNameTrendDSM'),' '),0,6)),uniquestring(resourceGroup().id)))]"
+ },
+ "storage-api-version": {
+ "value": "2015-06-15"
+ },
+ "storageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "location": {
+ "value": "westus"
+ },
+ "network-api-version": {
+ "value": "2015-06-15"
+ },
+ "virtualNetworkName": {
+ "value": "datameerP2PVnet"
+ },
+ "vnetAddressPrefix": {
+ "value": "10.7.0.0/16"
+ },
+ "subnet1Name": {
+ "value": "trendMicroDSMsubnet"
+ },
+ "subnet1Prefix": {
+ "value": "10.7.0.0/24"
+ },
+ "subnet2Name": {
+ "value": "chefServersubnet"
+ },
+ "subnet2Prefix": {
+ "value": "10.7.1.0/24"
+ },
+ "subnet3Name": {
+ "value": "(datameerHDInsightCluster).clusterNamesubnet"
+ },
+ "subnet3Prefix": {
+ "value": "10.7.4.0/24"
+ },
+ "subnet4Name": {
+ "value": "vmsubnet"
+ },
+ "subnet4Prefix": {
+ "value": "10.7.3.0/24"
+ },
+ "tagvalues": {
+ "value": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "availabilitySetSettings": {
+ "value": {
+ "name": "datameerP2PVnet-aset",
+ "count": 1,
+ "fdCount": 3,
+ "udCount": 5
+ }
+ },
+ "datameerTags": {
+ "value": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ }
+ },
+ "trendmicroTags": {
+ "value": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ }
+ },
+ "chefSoftwareTags": {
+ "value": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "trendmicrodsm",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vnetstorage"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/trendp2p-trenddsm.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "storageAccountName": {
+ "value": "[tolower(concat(trim(substring(concat(variables('vmNameTrendDSM'),' '),0,6)),uniquestring(resourceGroup().id)))]"
+ },
+ "vmStorageAccountContainerName": {
+ "value": "vhds"
+ },
+ "location": {
+ "value": "westus"
+ },
+ "network-api-version": {
+ "value": "2015-06-15"
+ },
+ "compute-api-version": {
+ "value": "2015-06-15"
+ },
+ "tagvalues": {
+ "value": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "publicIPDomainNameLabelTrendDSM": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "publicIPAddressType": {
+ "value": "Dynamic"
+ },
+ "publicIPAddressNameTrendDSM": {
+ "value": "publicIPTrendDSM"
+ },
+ "nicNameTrendDSM": {
+ "value": "trendMicroDSM-nic"
+ },
+ "virtualNetworkName": {
+ "value": "datameerP2PVnet"
+ },
+ "subnet1Ref": {
+ "value": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/trendMicroDSMsubnet"
+ },
+ "securityGroupNameTrendDSM": {
+ "value": "trendMicroDSM-nic-nsg"
+ },
+ "managerPortTrendDSM": {
+ "value": "443"
+ },
+ "heartbeatPortTrendDSM": {
+ "value": "4120"
+ },
+ "vmNameTrendDSM": {
+ "value": "trendMicroDSM"
+ },
+ "publisherTrendDSM": {
+ "value": "trendmicro"
+ },
+ "offerChoosedTrendDSM": {
+ "value": "concat(offer, parameters(vmSizeTrendDSM))"
+ },
+ "vmAdminNameTrendDSM": {
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrPublicKeyTrendDSM": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "linuxConfigurationChoosenTrendDSM": {
+ "value": "linuxConfigurationChoosenTrendDSM"
+ },
+ "deployment-api-version": {
+ "value": "2015-11-01"
+ },
+ "baseUrl": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/chef/datameer-trend-chef-riskanalysis/"
+ },
+ "databaseOption": {
+ "value": "new"
+ },
+ "newsqlServerName": {
+ "value": "[tolower(concat(variables('vmNameTrendDSM'),uniquestring(resourceGroup().id),'-sql'))]"
+ },
+ "existingSQLServerName": {
+ "value": ""
+ },
+ "dbAdminName": {
+ "value": "demo"
+ },
+ "dbAdminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "dbName": {
+ "value": "dsm"
+ },
+ "dsmAdminName": {
+ "value": "demo"
+ },
+ "dsmAdminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "datameerTags": {
+ "value": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ }
+ },
+ "trendmicroTags": {
+ "value": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ }
+ },
+ "chefSoftwareTags": {
+ "value": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ }
+ }
+ }
+ },
+ {
+ "name": "orchestrator",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vnetstorage"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/trendp2p-orchestrator.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "storageAccountName": {
+ "value": "[tolower(concat(trim(substring(concat(variables('vmNameTrendDSM'),' '),0,6)),uniquestring(resourceGroup().id)))]"
+ },
+ "location": {
+ "value": "westus"
+ },
+ "network-api-version": {
+ "value": "2015-06-15"
+ },
+ "compute-api-version": {
+ "value": "2015-06-15"
+ },
+ "deployment-api-version2": {
+ "value": "2015-01-01"
+ },
+ "tagvalues": {
+ "value": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "publicIPDomainNameLabelOrchServer": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "vmNameOrchServer": {
+ "value": "orchestratorServer"
+ },
+ "networkInterfaceNameOrchServer": {
+ "value": "orchestratorServer-nic"
+ },
+ "networkSecurityGroupNameOrchServer": {
+ "value": "orchestratorServer-nic-nsg"
+ },
+ "vmAdminUsernameOrchServer": {
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrPublicKeyOrchServer": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmStorageAccountContainerName": {
+ "value": "vhds"
+ },
+ "imagePublisherLinux": {
+ "value": "Canonical"
+ },
+ "imageOfferLinux": {
+ "value": "UbuntuServer"
+ },
+ "orcServerubuntuOSVersion": {
+ "value": "14.04.2-LTS"
+ },
+ "vmSizeOrcServer": {
+ "value": "Standard_D2_v3"
+ },
+ "subnet2Ref": {
+ "value": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/chefServersubnet"
+ },
+ "installOrchTemplateurl": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('nested/orchestrator-server-setup-trend.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "datameerTags": {
+ "value": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ }
+ },
+ "trendmicroTags": {
+ "value": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ }
+ },
+ "chefSoftwareTags": {
+ "value": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ }
+ }
+ }
+ },
+ {
+ "name": "chefserver",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vnetstorage",
+ "Microsoft.Resources/deployments/trendmicrodsm",
+ "Microsoft.Resources/deployments/orchestrator"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/trendp2p-chefserver.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "storageAccountName": {
+ "value": "[tolower(concat(trim(substring(concat(variables('vmNameTrendDSM'),' '),0,6)),uniquestring(resourceGroup().id)))]"
+ },
+ "publicIPAddressNameChefServer": {
+ "value": "publicIPChefServer"
+ },
+ "publicIPDomainNameLabelChefServer": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "networkSecurityGroupNameChefServer": {
+ "value": "chefServer-nic-nsg"
+ },
+ "networkInterfaceNameChefServer": {
+ "value": "chefServer-nic"
+ },
+ "vmNameChefServer": {
+ "value": "chefServer"
+ },
+ "vmAdminUsernameChefServer": {
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrPublicKeyChefServer": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmStorageAccountContainerName": {
+ "value": "vhds"
+ },
+ "location": {
+ "value": "westus"
+ },
+ "network-api-version": {
+ "value": "2015-06-15"
+ },
+ "compute-api-version": {
+ "value": "2015-06-15"
+ },
+ "tagvalues": {
+ "value": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "publisherChefServer": {
+ "value": "chef-software"
+ },
+ "offerChoosedChefServer": {
+ "value": "concat(offer, parameters(vmSizeChefServer))"
+ },
+ "subnet2Ref": {
+ "value": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/chefServersubnet"
+ },
+ "publicIPAddressType": {
+ "value": "Dynamic"
+ },
+ "chefUserName": {
+ "value": "chefuser"
+ },
+ "chefUserFirstName": {
+ "value": "chef"
+ },
+ "chefUserLastName": {
+ "value": "user"
+ },
+ "chefUserEmail": {
+ "value": "chef@noone.com"
+ },
+ "chefUserPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "chefOrgShortName": {
+ "value": "ct"
+ },
+ "chefOrgFullName": {
+ "value": "Chef Test Inc"
+ },
+ "chefServerScriptUrl": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('scripts/chefserver.sh', parameters('_artifactsLocationSasToken')))]"
+ },
+ "publicIPDomainNameLabelOrchServer": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "datameerTags": {
+ "value": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ }
+ },
+ "trendmicroTags": {
+ "value": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ }
+ },
+ "chefSoftwareTags": {
+ "value": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-01-01",
+ "type": "Microsoft.Resources/deployments",
+ "name": "dsagents",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vnetstorage",
+ "Microsoft.Resources/deployments/trendmicrodsm",
+ "Microsoft.Resources/deployments/chefserver"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/trendp2p-dsagents.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "westus"
+ },
+ "network-api-version": {
+ "value": "2015-06-15"
+ },
+ "compute-api-version": {
+ "value": "2015-06-15"
+ },
+ "vmNameDSAWindows": {
+ "value": "dsawindows"
+ },
+ "vmSizeDSAWindows": {
+ "value": "Standard_D2_v3"
+ },
+ "adminUsernameDSAgentWindows": {
+ "value": "demo"
+ },
+ "adminPasswordDSAgentWindows": {
+ "value": "GEN-PASSWORD"
+ },
+ "publicIPDomainNameLabelDSAgentWindows": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "windowsOSVersion": {
+ "value": "2012-R2-Datacenter"
+ },
+ "windowsvmcount": {
+ "value": 1
+ },
+ "vmNameDSAgent": {
+ "value": "dsalinux"
+ },
+ "vmSizeDSAgent": {
+ "value": "Standard_D2_v3"
+ },
+ "adminUsernameDSAgent": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPasswordOrPublicKeyDSAgent": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "publicIPDomainNameLabelDSAgent": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "ubuntuOSVersion": {
+ "value": "14.04.2-LTS"
+ },
+ "linuxvmcount": {
+ "value": 1
+ },
+ "ManagerAddress": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)].westus.cloudapp.azure.com"
+ },
+ "subnet4Ref": {
+ "value": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/vmsubnet"
+ },
+ "imagePublisherWindows": {
+ "value": "MicrosoftWindowsServer"
+ },
+ "imageOfferWindows": {
+ "value": "WindowsServer"
+ },
+ "imagePublisherLinux": {
+ "value": "Canonical"
+ },
+ "imageOfferLinux": {
+ "value": "UbuntuServer"
+ },
+ "storageAccountName": {
+ "value": "[tolower(concat(trim(substring(concat(variables('vmNameTrendDSM'),' '),0,6)),uniquestring(resourceGroup().id)))]"
+ },
+ "vmStorageAccountContainerName": {
+ "value": "vhds"
+ },
+ "ActivationPort": {
+ "value": "4120"
+ },
+ "TenantIdentifier": {
+ "value": "NA"
+ },
+ "TenantActivationPassword": {
+ "value": "NA"
+ },
+ "tagvalues": {
+ "value": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "datameerTags": {
+ "value": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ }
+ },
+ "trendmicroTags": {
+ "value": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ }
+ },
+ "chefSoftwareTags": {
+ "value": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-01-01",
+ "type": "Microsoft.Resources/deployments",
+ "name": "chefnodes",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vnetstorage",
+ "Microsoft.Resources/deployments/trendmicrodsm",
+ "Microsoft.Resources/deployments/chefserver"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/trendp2p-chefnodes.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "westus"
+ },
+ "network-api-version": {
+ "value": "2015-06-15"
+ },
+ "compute-api-version": {
+ "value": "2015-06-15"
+ },
+ "deployment-api-version2": {
+ "value": "2015-01-01"
+ },
+ "vmNameChefWorkstation": {
+ "value": "chefWS"
+ },
+ "vmSizeChefWorkstation": {
+ "value": "Standard_D2_v3"
+ },
+ "adminUsernameChefWorkstation": {
+ "value": "demo"
+ },
+ "adminPasswordChefWorkstation": {
+ "value": "GEN-PASSWORD"
+ },
+ "publicIPDomainNameLabelChefWorkstation": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "vmNameDSAWindows": {
+ "value": "dsawindows"
+ },
+ "vmSizeDSAWindows": {
+ "value": "Standard_D2_v3"
+ },
+ "adminUsernameDSAgentWindows": {
+ "value": "demo"
+ },
+ "adminPasswordDSAgentWindows": {
+ "value": "GEN-PASSWORD"
+ },
+ "publicIPDomainNameLabelDSAgentWindows": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "windowsOSVersion": {
+ "value": "2012-R2-Datacenter"
+ },
+ "windowsvmcount": {
+ "value": 1
+ },
+ "vmNameDSAgent": {
+ "value": "dsalinux"
+ },
+ "vmSizeDSAgent": {
+ "value": "Standard_D2_v3"
+ },
+ "adminUsernameDSAgent": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPasswordOrPublicKeyDSAgent": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "publicIPDomainNameLabelDSAgent": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)]"
+ },
+ "ubuntuOSVersion": {
+ "value": "14.04.2-LTS"
+ },
+ "linuxvmcount": {
+ "value": 1
+ },
+ "ManagerAddress": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)].westus.cloudapp.azure.com"
+ },
+ "subnet4Ref": {
+ "value": "Microsoft.Network/virtualNetworks/datameerP2PVnet/subnets/vmsubnet"
+ },
+ "imagePublisherWindows": {
+ "value": "MicrosoftWindowsServer"
+ },
+ "imageOfferWindows": {
+ "value": "WindowsServer"
+ },
+ "imagePublisherLinux": {
+ "value": "Canonical"
+ },
+ "imageOfferLinux": {
+ "value": "UbuntuServer"
+ },
+ "storageAccountName": {
+ "value": "[tolower(concat(trim(substring(concat(variables('vmNameTrendDSM'),' '),0,6)),uniquestring(resourceGroup().id)))]"
+ },
+ "vmStorageAccountContainerName": {
+ "value": "vhds"
+ },
+ "ActivationPort": {
+ "value": "4120"
+ },
+ "TenantIdentifier": {
+ "value": "NA"
+ },
+ "TenantActivationPassword": {
+ "value": "NA"
+ },
+ "tagvalues": {
+ "value": {
+ "program": "PushToPilot",
+ "project": "DatameerTrendHDInsightChef"
+ }
+ },
+ "chefprefix": {
+ "value": "chef"
+ },
+ "keyName": {
+ "value": "validatorkey"
+ },
+ "kmServerUrl": {
+ "value": "GEN-UNIQUE[uniquestring(resourceGroup().id)].westus.cloudapp.azure.com"
+ },
+ "chef_node_name": {
+ "value": "chefnodedsagent"
+ },
+ "chef_server_url": {
+ "value": "https://GEN-UNIQUE[uniquestring(resourceGroup().id)].westus.cloudapp.azure.com/organizations/ct"
+ },
+ "validation_client_name": {
+ "value": "ct-validator"
+ },
+ "validation_key_format": {
+ "value": "base64encoded"
+ },
+ "runlist": {
+ "value": "recipe[trendmicro]"
+ },
+ "resourcegroupName": {
+ "value": "[resourceGroup().name]"
+ },
+ "chefnodeCustomScripturl": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('scripts/p2pchefnodebootstrap.sh', parameters('_artifactsLocationSasToken')))]"
+ },
+ "baseUrl": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/chef/datameer-trend-chef-riskanalysis/"
+ },
+ "datameerTags": {
+ "value": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ }
+ },
+ "trendmicroTags": {
+ "value": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ }
+ },
+ "chefSoftwareTags": {
+ "value": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-01-01",
+ "type": "Microsoft.Resources/deployments",
+ "name": "datameerhdinsight",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vnetstorage"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(datameerHDInsightCluster).standaloneTemplateUrl",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "westus"
+ },
+ "clusterName": {
+ "value": "(datameerHDInsightCluster).clusterName"
+ },
+ "clusterType": {
+ "value": "(datameerHDInsightCluster).clusterType"
+ },
+ "clusterLoginUserName": {
+ "value": "(datameerHDInsightCluster).clusterLoginUserName"
+ },
+ "clusterLoginPassword": {
+ "value": "(datameerHDInsightCluster).clusterLoginPassword"
+ },
+ "sshUserName": {
+ "value": "(datameerHDInsightCluster).sshUserName"
+ },
+ "sshPassword": {
+ "value": "(datameerHDInsightCluster).sshPassword"
+ },
+ "storageAccount": {
+ "value": "(datameerHDInsightCluster).storageAccount"
+ },
+ "clusterVNetName": {
+ "value": "datameerP2PVnet"
+ },
+ "clusterVnetAddressSpace": {
+ "value": "10.7.0.0/16"
+ },
+ "clusterVNetSubnetAddressRange": {
+ "value": "10.7.4.0/24"
+ },
+ "clusterVNetSubnetName": {
+ "value": "(datameerHDInsightCluster).clusterNamesubnet"
+ },
+ "datameerTags": {
+ "value": {
+ "type": "object",
+ "provider": "ED5CBF45-2AA4-4408-B52D-1C76DFCA0BD7"
+ }
+ },
+ "trendmicroTags": {
+ "value": {
+ "type": "object",
+ "provider": "F0253A01-8156-4D41-BD91-E182158D4972"
+ }
+ },
+ "chefSoftwareTags": {
+ "value": {
+ "type": "object",
+ "provider": "33194f91-eb5f-4110-827a-e95f640a9e46"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "datameer-trend-chef-riskanalysis"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "TrendMicro DSM URI": {
+ "type": "string",
+ "value": "[reference('trendmicrodsm').outputs.trendmicrodsmUri.value]"
+ },
+ "Chef Server URI": {
+ "type": "string",
+ "value": "[reference('chefserver').outputs.chefserverUri.value]"
+ },
+ "Datameer App URI": {
+ "type": "string",
+ "value": "[reference('datameerhdinsight').outputs.datameerAppURL.value]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT720 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT720
new file mode 100644
index 0000000..a408643
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT720
@@ -0,0 +1,445 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ipv6-in-vnet-stdlb/azuredeploy.json",
+ "/demos/ipv6-in-vnet-stdlb/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899521,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ipv6-in-vnet-stdlb/azuredeploy.json",
+ "/demos/ipv6-in-vnet-stdlb/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT720",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/availabilitysets",
+ "microsoft.network/routetables"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT720",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the administrator of the new VM. Exclusion list: 'admin','administrator'"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the administrator account of the new VM"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "metadata": {
+ "description": "Size of VMs to deploy in VNET."
+ }
+ }
+ },
+ "variables": {
+ "vnetv4AddressRange": "10.0.0.0/16",
+ "vnetv6AddressRange": "ace:cab:deca::/48",
+ "subnetv4AddressRange": "10.0.0.0/24",
+ "subnetv6AddressRange": "ace:cab:deca:deed::/64",
+ "subnetName": "DualStackSubnet",
+ "availabilitySetName": "myavset",
+ "numberOfInstances": 2,
+ "vmName": "DsVM",
+ "publicipName": "RDPpublicIp",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "imageSku": "2019-Datacenter"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "RDPpublicIpcopyindex()",
+ "copy": {
+ "name": "publicIpLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "lbpublicip",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "lbpublicip-v6",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "publicIPAddressVersion": "IPv6"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myavset",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "name": "loadBalancer",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/lbpublicip",
+ "Microsoft.Network/publicIPAddresses/lbpublicip-v6"
+ ],
+ "properties": {
+ "frontendIpConfigurations": [
+ {
+ "name": "LBFE",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/lbpublicip"
+ }
+ }
+ },
+ {
+ "name": "LBFE-v6",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/lbpublicip-v6"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LBBAP"
+ },
+ {
+ "name": "LBBAP-v6"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/loadBalancer/LBFE"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "idleTimeoutInMinutes": 15,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/loadBalancer/IPv4IPv6probe"
+ }
+ },
+ "name": "lbrule"
+ },
+ {
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/loadBalancer/LBFE-v6"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP-v6"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/loadBalancer/IPv4IPv6probe"
+ }
+ },
+ "name": "lbrule-v6"
+ }
+ ],
+ "probes": [
+ {
+ "name": "IPv4IPv6probe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "VNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16",
+ "ace:cab:deca::/48"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "DualStackSubnet",
+ "properties": {
+ "addressPrefixes": [
+ "10.0.0.0/24",
+ "ace:cab:deca:deed::/64"
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "dsNsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "allow-HTTP-in",
+ "properties": {
+ "description": "Allow HTTP",
+ "protocol": "TCP",
+ "sourcePortRange": "80",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1001,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-all-out",
+ "properties": {
+ "description": "Allow out All",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1002,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "allow-RDP-in",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1003,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-MyIpv6App-out",
+ "properties": {
+ "description": "Allow My IPv6 App",
+ "protocol": "Tcp",
+ "sourcePortRange": "33819-33829",
+ "destinationPortRange": "5000-6000",
+ "sourceAddressPrefix": "ace:cab:deca:deed::/64",
+ "destinationAddressPrefixes": [
+ "cab:cab:aaaa:bbbb::/64",
+ "cab:cab:1111:2222::/64"
+ ],
+ "access": "Allow",
+ "priority": 1004,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/routeTables",
+ "name": "v6routeTable",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "routes": [
+ {
+ "name": "v6route",
+ "properties": {
+ "addressPrefix": "cab:cab::/96",
+ "nextHopType": "VirtualAppliance",
+ "nextHopIpAddress": "ace:cab:deca:f00d::1"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "DsVMcopyindex()",
+ "copy": {
+ "name": "netIntLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/VNET",
+ "Microsoft.Network/networkSecurityGroups/dsNsg",
+ "Microsoft.Network/loadBalancers/loadBalancer",
+ "publicIpLoop"
+ ],
+ "properties": {
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/dsNsg"
+ },
+ "ipConfigurations": [
+ {
+ "name": "ipconfig-v4",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "privateIPAddressVersion": "IPv4",
+ "primary": true,
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/RDPpublicIpcopyindex()"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/DualStackSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP"
+ }
+ ]
+ }
+ },
+ {
+ "name": "ipconfig-v6",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "privateIPAddressVersion": "IPv6",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/DualStackSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/LBBAP-v6"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "DsVMcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/availabilitySets/myavset",
+ "netIntLoop"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myavset"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "DsVMcopyindex()",
+ "adminUsername": "adminUserName",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/DsVMcopyindex()"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT721 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT721
new file mode 100644
index 0000000..2654250
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT721
@@ -0,0 +1,387 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ipv6-in-vnet-vmss/azuredeploy.json",
+ "/demos/ipv6-in-vnet-vmss/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899551,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ipv6-in-vnet-vmss/azuredeploy.json",
+ "/demos/ipv6-in-vnet-vmss/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT721",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.compute/virtualmachinescalesets",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT721",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the administrator of the new VM. Exclusion list: 'admin','administrator'"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the administrator account of the new VM"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "vmSku": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of VMs in the VM Scale Set."
+ }
+ },
+ "vmssName": {
+ "type": "string",
+ "defaultValue": "MySet",
+ "metadata": {
+ "description": "String used as a base for naming resources (9 characters or less)."
+ },
+ "maxLength": 9
+ },
+ "instanceCount": {
+ "type": "int",
+ "metadata": {
+ "description": "Number of VM instances (100 or less)."
+ },
+ "defaultValue": 2,
+ "minValue": 1,
+ "maxValue": 100
+ }
+ },
+ "variables": {
+ "vnetv4AddressRange": "10.0.0.0/16",
+ "vnetv6AddressRange": "ace:cab:deca::/48",
+ "subnetv4AddressRange": "10.0.0.0/24",
+ "subnetv6AddressRange": "ace:cab:deca:deed::/64",
+ "virtualNetworkName": "MySetvnet",
+ "subnetName": "MySetsubnet",
+ "natPoolName": "MySetnatpool",
+ "bePoolName": "MySetbepool",
+ "bePoolv6Name": "MySetbepoolv6",
+ "natStartPort": 50000,
+ "natEndPort": 50120,
+ "natBackendPort": 3389,
+ "nicName": "MySetnic",
+ "ipConfigName": "MySetipconfig",
+ "ipConfigNameV6": "MySetipconfig-v6",
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MySetvnet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "dhcpOptions": {
+ "dnsServers": [
+ "cafe:43::",
+ "cafe:45::"
+ ]
+ },
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16",
+ "ace:cab:deca::/48"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "MySetsubnet",
+ "properties": {
+ "addressPrefixes": [
+ "10.0.0.0/24",
+ "ace:cab:deca:deed::/64"
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "PIPv4",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "publicIPAddressVersion": "IPv4"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "PIPv6",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "publicIPAddressVersion": "IPv6"
+ }
+ },
+ {
+ "type": "Microsoft.Network/loadBalancers",
+ "name": "loadBalancer",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/PIPv4",
+ "Microsoft.Network/publicIPAddresses/PIPv6"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LBFE",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/PIPv4"
+ }
+ }
+ },
+ {
+ "name": "LBFE-v6",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/PIPv6"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "MySetbepool"
+ },
+ {
+ "name": "MySetbepoolv6"
+ }
+ ],
+ "inboundNatPools": [
+ {
+ "name": "MySetnatpool",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/loadBalancer/LBFE"
+ },
+ "protocol": "tcp",
+ "frontendPortRangeStart": 50000,
+ "frontendPortRangeEnd": 50120,
+ "backendPort": 3389
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "VmssNsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "allow-HTTP-in",
+ "properties": {
+ "description": "Allow HTTP",
+ "protocol": "TCP",
+ "sourcePortRange": "80",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1001,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-all-out",
+ "properties": {
+ "description": "Allow out All",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1002,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "allow-RDP-in",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 1003,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow-MyIpv6App-out",
+ "properties": {
+ "description": "Allow My IPv6 App",
+ "protocol": "Tcp",
+ "sourcePortRange": "33819-33829",
+ "destinationPortRange": "5000-6000",
+ "sourceAddressPrefix": "ace:cab:deca:deed::/64",
+ "destinationAddressPrefixes": [
+ "cab:cab:aaaa:bbbb::/64",
+ "cab:cab:1111:2222::/64"
+ ],
+ "access": "Allow",
+ "priority": 1004,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "name": "MySet",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers//loadBalancer",
+ "Microsoft.Network/virtualNetworks//MySetvnet"
+ ],
+ "sku": {
+ "name": "Standard_D2_v3",
+ "tier": "Standard",
+ "capacity": 2
+ },
+ "properties": {
+ "overprovision": false,
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "caching": "ReadOnly",
+ "createOption": "FromImage"
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": "MySet",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "MySetnic",
+ "properties": {
+ "primary": true,
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/VmssNsg"
+ },
+ "ipConfigurations": [
+ {
+ "name": "MySetipconfig",
+ "properties": {
+ "primary": true,
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MySetvnet/MySetsubnet"
+ },
+ "privateIPAddressVersion": "IPv4",
+ "publicipaddressconfiguration": {
+ "name": "pub1",
+ "properties": {
+ "idleTimeoutInMinutes": 15
+ }
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/MySetbepool"
+ }
+ ],
+ "loadBalancerInboundNatPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatPools/loadBalancer/MySetnatpool"
+ }
+ ]
+ }
+ },
+ {
+ "name": "MySetipconfig-v6",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MySetvnet/MySetsubnet"
+ },
+ "privateIPAddressVersion": "IPv6",
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/loadBalancer/MySetbepoolv6"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT722 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT722
new file mode 100644
index 0000000..49daf37
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT722
@@ -0,0 +1,441 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/kubernetes-on-ubuntu-vmss/azuredeploy.json",
+ "/demos/kubernetes-on-ubuntu-vmss/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899595,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/kubernetes-on-ubuntu-vmss/azuredeploy.json",
+ "/demos/kubernetes-on-ubuntu-vmss/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT722",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachinescalesets",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT722",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of your VM master node."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmssName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of your VMSS cluster."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key for the Virtual Machine."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "defaultNodeCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The initial node size of your VMSS cluster."
+ }
+ },
+ "minNodeCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The min node size of your VMSS cluster."
+ }
+ },
+ "maxNodeCount": {
+ "type": "int",
+ "defaultValue": 20,
+ "metadata": {
+ "description": "The max node size of your VMSS cluster."
+ }
+ },
+ "spClientId": {
+ "type": "string",
+ "metadata": {
+ "description": "ServicePrincipal ClientID"
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "spClientSecret": {
+ "type": "securestring",
+ "metadata": {
+ "description": "ServicePrincipal Secret"
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "defaultValue": "[toLower(concat('k8s-cluster-', uniqueString(resourceGroup().id)))]",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
+ }
+ },
+ "vmssDnsLabelPrefix": {
+ "type": "string",
+ "defaultValue": "[toLower(concat('k8s-vmss-cluster-', uniqueString(resourceGroup().id)))]",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the VMSS."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "The size of the VM"
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "vNet",
+ "metadata": {
+ "description": "Name of the VNET"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "Subnet",
+ "metadata": {
+ "description": "Name of the subnet in the virtual network"
+ }
+ },
+ "vmssSubnetName": {
+ "type": "string",
+ "defaultValue": "VMSSSubnet",
+ "metadata": {
+ "description": "Name of the VMSS subnet in the virtual network"
+ }
+ }
+ },
+ "variables": {
+ "publicIpAddressName": "GEN-UNIQUEPublicIP",
+ "vmssPublicIpAddressName": "GEN-UNIQUEPublicIP",
+ "networkInterfaceName": "GEN-UNIQUENetInt",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/vNet/Subnet",
+ "vmssSubnetRef": "Microsoft.Network/virtualNetworks/subnets/vNet/VMSSSubnet",
+ "osDiskType": "StandardSSD_LRS",
+ "scriptsDir": "scripts",
+ "masterScriptFileName": "cloud-init-master.sh",
+ "vmssScriptFileName": "cloud-init-vmss.sh",
+ "subscriptionId": "[subscription().subscriptionId]",
+ "tenantId": "[subscription().tenantId]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUENetInt",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//vNet",
+ "Microsoft.Network/publicIpAddresses//GEN-UNIQUEPublicIP"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vNet/Subnet"
+ },
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIpAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIPAddressName"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-08-01",
+ "name": "vNet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "VMSSSubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ },
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUEPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "publicIPAddressVersion": "IPv4",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(concat('k8s-cluster-', uniqueString(resourceGroup().id)))]"
+ },
+ "idleTimeoutInMinutes": 10
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//GEN-UNIQUENetInt"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUENetInt"
+ }
+ ]
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE/customScript",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "commandToExecute": "[concat('bash ', variables('masterScriptFileName'), ' ', parameters('spClientId'), ' ', parameters('spClientSecret'), ' ', resourceGroup().name, ' ', variables('subscriptionId'), ' ', variables('tenantId'))]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('scriptsDir'), '/', variables('masterScriptFileName'), parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "apiVersion": "2020-12-01",
+ "name": "GEN-UNIQUE",
+ "tags": {
+ "cluster-autoscaler-enabled": "true",
+ "cluster-autoscaler-name": "[resourceGroup().name]",
+ "min": 1,
+ "max": 20,
+ "poolName": "GEN-UNIQUE"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//GEN-UNIQUENetInt"
+ ],
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_D2s_v3",
+ "tier": "Standard",
+ "capacity": 1
+ },
+ "properties": {
+ "overprovision": false,
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "caching": "ReadWrite"
+ },
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": "GEN-UNIQUE",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "nicGEN-UNIQUE",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "ipconfigVmssGEN-UNIQUE",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vNet/VMSSSubnet"
+ },
+ "publicIPAddressConfiguration": {
+ "name": "GEN-UNIQUEPublicIP",
+ "properties": {
+ "idleTimeoutInMinutes": 10,
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(concat('k8s-vmss-cluster-', uniqueString(resourceGroup().id)))]"
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "extensionProfile": {
+ "extensions": [
+ {
+ "name": "customVmssScript",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "commandToExecute": "[concat('bash ', variables('vmssScriptFileName'), ' ', parameters('spClientId'), ' ', parameters('spClientSecret'), ' ', resourceGroup().name, ' ', variables('subscriptionId'), ' ', variables('tenantId'), ' ', parameters('location'), ' ', parameters('vmssSubnetName'), ' ', parameters('virtualNetworkName'))]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('scriptsDir'), '/', variables('vmssScriptFileName'), parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "adminUsername": {
+ "type": "string",
+ "value": "[parameters('adminUsername')]"
+ },
+ "hostname": {
+ "type": "string",
+ "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
+ },
+ "sshCommand": {
+ "type": "string",
+ "value": "[concat('ssh ', parameters('adminUsername'), '@', reference(variables('publicIPAddressName')).dnsSettings.fqdn)]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT723 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT723
new file mode 100644
index 0000000..dc0c682
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT723
@@ -0,0 +1,334 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/lamp-app/azuredeploy.json",
+ "/demos/lamp-app/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899635,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/lamp-app/azuredeploy.json",
+ "/demos/lamp-app/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT723",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT723",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountNamePrefix": {
+ "type": "string",
+ "maxLength": 11,
+ "metadata": {
+ "description": "Name prefix of the Storage Account"
+ },
+ "value": "GEN-UNIQUE-11"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "mySqlPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the MySQL admin user."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Label for the Public IP. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "14.04.5-LTS",
+ "allowedValues": [
+ "12.04.5-LTS",
+ "14.04.5-LTS",
+ "15.10"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values: 12.04.5-LTS, 14.04.5-LTS, 15.10."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A2",
+ "metadata": {
+ "description": "The size of the virtual machine."
+ },
+ "value": "Standard_A2"
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyUbuntuVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet",
+ "networkSecurityGroupName": "default-NSG",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE-11",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-08-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-22",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "default-allow-80",
+ "properties": {
+ "priority": 1001,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "80",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP",
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyUbuntuVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE-11",
+ "Microsoft.Network/networkInterfaces//myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "MyUbuntuVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "MyUbuntuVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "MyUbuntuVM/newuserscript",
+ "apiVersion": "2015-06-15",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//MyUbuntuVM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('install_lamp.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "sh install_lamp.sh GEN-PASSWORD"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT724 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT724
new file mode 100644
index 0000000..55ccca2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT724
@@ -0,0 +1,393 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/managed-disk-performance-meter/azuredeploy.json",
+ "/demos/managed-disk-performance-meter/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899652,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/managed-disk-performance-meter/azuredeploy.json",
+ "/demos/managed-disk-performance-meter/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT724",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT724",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4_v3",
+ "metadata": {
+ "description": "Size of the VM that runs the test. Use VMs with high performance to get better results"
+ }
+ },
+ "dataDiskHostCaching": {
+ "type": "string",
+ "defaultValue": "ReadOnly",
+ "allowedValues": [
+ "",
+ "ReadOnly",
+ "ReadWrite"
+ ],
+ "metadata": {
+ "description": "Data disk caching type for the test disk"
+ }
+ },
+ "diskSizeGB": {
+ "type": "string",
+ "allowedValues": [
+ "128",
+ "512",
+ "1023"
+ ],
+ "defaultValue": "1023",
+ "metadata": {
+ "description": "Disk size in GB"
+ }
+ },
+ "testType": {
+ "type": "string",
+ "allowedValues": [
+ "read",
+ "write",
+ "randread",
+ "randwrite",
+ "randtrim",
+ "rw",
+ "readwrite",
+ "randrw"
+ ],
+ "defaultValue": "randread",
+ "metadata": {
+ "description": "Disk test type to run. (rand: random, sequential otherwise; rw - read/write)"
+ }
+ },
+ "testSize": {
+ "type": "string",
+ "allowedValues": [
+ "32m",
+ "64m",
+ "128m",
+ "256m",
+ "512m",
+ "1g",
+ "2g",
+ "10g",
+ "30g"
+ ],
+ "defaultValue": "1g",
+ "metadata": {
+ "description": "Size of the file to test."
+ }
+ },
+ "testBlockSize": {
+ "type": "string",
+ "allowedValues": [
+ "4k",
+ "8k",
+ "16k",
+ "32k",
+ "64k"
+ ],
+ "defaultValue": "8k",
+ "metadata": {
+ "description": "Size of the block to test."
+ }
+ },
+ "secondsToRunTest": {
+ "type": "int",
+ "defaultValue": 30,
+ "metadata": {
+ "description": "Number of seconds for the test to run."
+ }
+ },
+ "threadsToRunTest": {
+ "type": "int",
+ "defaultValue": 4,
+ "minValue": 1,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Number of worker threads for the test to run."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the test VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "osVersion": "14.04.5-LTS",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "testVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressName": "publicIP",
+ "virtualNetworkName": "testVNET",
+ "scriptFolder": "scripts",
+ "storageAccountName": "[concat(uniqueString(resourceGroup().id), 'storage')]",
+ "frontEndNSGName": "[concat('webtestnsg-', uniqueString(resourceGroup().id))]",
+ "vmName": "testVM",
+ "testScriptFileName": "disktest.sh",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "testVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "testVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "publicIP",
+ "testVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/testVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('frontEndNSGName')]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "NSG"
+ },
+ "dependsOn": [
+ "publicIP"
+ ],
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh-rule",
+ "properties": {
+ "description": "Allow SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2016-04-30-preview",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "testVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[variables('storageAccountName')]",
+ "[variables('nicName')]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "computerName": "testVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": "1023",
+ "lun": 0,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/testVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('storageAccountName'), '2021-01-01').primaryEndpoints.blob]"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "extensions",
+ "name": "CustomScriptExtension",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [
+ "testVM"
+ ],
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "CustomScriptForLinux",
+ "typeHandlerVersion": "1.5",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('scriptFolder'), '/', variables('testScriptFileName'), parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sudo bash disktest.sh 1g randread 30 4 8k"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "testresult": {
+ "type": "string",
+ "value": "[trim(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2])]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT725 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT725
new file mode 100644
index 0000000..22da233
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT725
@@ -0,0 +1,471 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/managed-disk-raid-performance-meter/azuredeploy.json",
+ "/demos/managed-disk-raid-performance-meter/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899697,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/managed-disk-raid-performance-meter/azuredeploy.json",
+ "/demos/managed-disk-raid-performance-meter/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT725",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT725",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSize": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_A5",
+ "Standard_A8",
+ "Standard_D8_v3",
+ "Standard_D16_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D4_v3",
+ "Standard_D32_v3",
+ "Standard_D4s_v3",
+ "Standard_D32s_v3"
+ ],
+ "defaultValue": "Standard_D4_v3",
+ "metadata": {
+ "description": "Size of the VM that runs the test."
+ }
+ },
+ "dataDiskHostCaching": {
+ "type": "string",
+ "defaultValue": "ReadOnly",
+ "allowedValues": [
+ "",
+ "ReadOnly",
+ "ReadWrite"
+ ],
+ "metadata": {
+ "description": "Data disk caching type for the test disk."
+ }
+ },
+ "diskSizeGB": {
+ "type": "string",
+ "allowedValues": [
+ "128",
+ "512",
+ "1023"
+ ],
+ "defaultValue": "1023",
+ "metadata": {
+ "description": "Disk size in GB."
+ }
+ },
+ "disksInRAID": {
+ "type": "int",
+ "defaultValue": 5,
+ "minValue": 1,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Number of disks striped in RAID. Should not be greater than selected instance type allows."
+ }
+ },
+ "testType": {
+ "type": "string",
+ "allowedValues": [
+ "read",
+ "write",
+ "randread",
+ "randwrite",
+ "randtrim",
+ "rw",
+ "readwrite",
+ "randrw"
+ ],
+ "defaultValue": "write",
+ "metadata": {
+ "description": "Disk test type to run. (rand: random, sequential otherwise; rw - read/write)."
+ }
+ },
+ "testSize": {
+ "type": "string",
+ "allowedValues": [
+ "32m",
+ "64m",
+ "128m",
+ "256m",
+ "512m",
+ "1g",
+ "2g",
+ "10g",
+ "30g"
+ ],
+ "defaultValue": "1g",
+ "metadata": {
+ "description": "Size of the file to test."
+ }
+ },
+ "testBlockSize": {
+ "type": "string",
+ "allowedValues": [
+ "4k",
+ "8k",
+ "16k",
+ "32k",
+ "64k",
+ "128k",
+ "256k"
+ ],
+ "defaultValue": "64k",
+ "metadata": {
+ "description": "Size of the block to test."
+ }
+ },
+ "secondsToRunTest": {
+ "type": "int",
+ "defaultValue": 30,
+ "metadata": {
+ "description": "Number of seconds for the test to run."
+ }
+ },
+ "threadsToRunTest": {
+ "type": "int",
+ "defaultValue": 8,
+ "minValue": 1,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Number of worker threads for the test to run."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the test VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "osVersion": "14.04.5-LTS",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "testVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressName": "publicIP",
+ "virtualNetworkName": "testVNET",
+ "scriptFolder": "scripts",
+ "storageAccountName": "[concat(uniqueString(resourceGroup().id), 'storage')]",
+ "frontEndNSGName": "[concat('webtestnsg-', uniqueString(resourceGroup().id))]",
+ "vmName": "testVM",
+ "testScriptFileName": "disktest.sh",
+ "diskArray": [
+ {
+ "diskSizeGB": "1023",
+ "lun": 0,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 1,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 2,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 3,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 4,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 5,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 6,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 7,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 8,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "diskSizeGB": "1023",
+ "lun": 9,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ }
+ ],
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "testVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "testVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "publicIP",
+ "testVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/testVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('frontEndNSGName')]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "NSG"
+ },
+ "dependsOn": [
+ "publicIP"
+ ],
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh-rule",
+ "properties": {
+ "description": "Allow SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2016-04-30-preview",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "testVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[variables('storageAccountName')]",
+ "[variables('nicName')]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "computerName": "testVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": "[take(variables('diskArray'),parameters('disksInRAID'))]"
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/testVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[concat(reference(variables('storageAccountName'), '2021-01-01').primaryEndpoints.blob)]"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "extensions",
+ "name": "CustomScriptExtension",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [
+ "testVM"
+ ],
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "CustomScriptForLinux",
+ "typeHandlerVersion": "1.5",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('scriptFolder'), '/', variables('testScriptFileName'), parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sudo bash disktest.sh 1g write 30 8 64k 5"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "testresult": {
+ "type": "string",
+ "value": "[trim(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2])]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT726 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT726
new file mode 100644
index 0000000..c9286a0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT726
@@ -0,0 +1,296 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/mcafee-extension-windows-vm/azuredeploy.json",
+ "/demos/mcafee-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899707,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/mcafee-extension-windows-vm/azuredeploy.json",
+ "/demos/mcafee-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT726",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT726",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Storage Account Name"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "metadata": {
+ "description": "Public IP Address Name"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic"
+ ],
+ "metadata": {
+ "description": "Public IP Address Type"
+ },
+ "value": "Dynamic"
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the VM"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the VM"
+ },
+ "value": "Standard_D4_v3"
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "VNET Name"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "VNET address space"
+ }
+ },
+ "subnet1Name": {
+ "type": "string",
+ "defaultValue": "Subnet-1",
+ "metadata": {
+ "description": "Subnet 1 name"
+ }
+ },
+ "subnet1Prefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet 1 address space"
+ }
+ },
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the NIC"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "vmExtensionName": {
+ "type": "string",
+ "metadata": {
+ "description": "Extension name"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountType": "Standard_LRS"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE-8",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-VNET-NAME",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//GEN-UNIQUE-8",
+ "Microsoft.Network/virtualNetworks//GEN-VNET-NAME"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-8"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE-8",
+ "Microsoft.Network/networkInterfaces//GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4_v3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE-8",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE-8_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-8"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-8/GEN-UNIQUE-8",
+ "apiVersion": "2015-05-01-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "publisher": "McAfee.EndpointSecurity",
+ "type": "McAfeeEndpointSecurity",
+ "typeHandlerVersion": "6.0",
+ "settings": {
+ "featureVS": "true",
+ "featureBP": "true",
+ "featureFW": "true",
+ "relayServer": "false"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT727 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT727
new file mode 100644
index 0000000..3ea9570
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT727
@@ -0,0 +1,390 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/memcached-multi-vm-ubuntu/azuredeploy.json",
+ "/demos/memcached-multi-vm-ubuntu/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899730,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/memcached-multi-vm-ubuntu/azuredeploy.json",
+ "/demos/memcached-multi-vm-ubuntu/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT727",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT727",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique name of the new storage account that will be created to store virtual machine VHDs"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "domainName": {
+ "type": "string",
+ "metadata": {
+ "description": "Domain name of the publicly accessible Apache test web server"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Virtual machine administrator username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Virtual machine administrator password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "memcachedVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A0",
+ "metadata": {
+ "description": "Size of the memcached virtual machine"
+ }
+ },
+ "apacheVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A0",
+ "metadata": {
+ "description": "Size of the Apache virtual machine"
+ }
+ },
+ "numberOfMemcachedInstances": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "Number of memcached virtual machines to provision"
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Virtual network name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/16",
+ "metadata": {
+ "description": "Virtual network address prefix"
+ }
+ },
+ "subnetDmzPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/24",
+ "metadata": {
+ "description": "Address prefix for the DMZ subnet"
+ }
+ },
+ "subnetMemcachedPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.1.0/24",
+ "metadata": {
+ "description": "Address prefix for the Memcached subnet"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "subnetMemcachedName": "GEN-UNIQUE-subnet",
+ "subnetDmzName": "GEN-UNIQUE-dmzsubnet",
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "subnetDmzRef": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE/GEN-UNIQUE-dmzsubnet",
+ "subnetMemcachedRef": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE/GEN-UNIQUE-subnet",
+ "memcachedMachineNamePrefix": "memcached"
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.1.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE-dmzsubnet",
+ "properties": {
+ "addressPrefix": "10.1.0.0/24"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-subnet",
+ "properties": {
+ "addressPrefix": "10.1.1.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicip",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicapache",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicip"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE/GEN-UNIQUE-dmzsubnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicmemcachedcopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "memcachedNicLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//GEN-UNIQUE"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//GEN-UNIQUE/GEN-UNIQUE-subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nicapache",
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A0"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicapache"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "memcachedcopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "memcachedVmLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nicmemcachedcopyindex()",
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A0"
+ },
+ "osProfile": {
+ "computerName": "memcachedcopyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "osdisk",
+ "vhd": {
+ "uri": "[concat('http://', parameters('newStorageAccountName'), '.blob.', environment().suffixes.storage, '/vhds/', variables('memcachedMachineNamePrefix'), copyindex(), '-osdisk.vhd')]"
+ },
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicmemcachedcopyindex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "memcachedcopyindex()/install_memcached",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "extensionLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//memcachedcopyindex()",
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('install_memcached.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('sh install_memcached.sh ', ' ', concat(reference(resourceId('Microsoft.Network/networkInterfaces/', concat('nicmemcached', copyindex()))).ipConfigurations[0].properties.privateIPAddress, ' ', reference('nicapache').ipConfigurations[0].properties.privateIPAddress))]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE/install_apache",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('install_apache.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh install_apache.sh 1 10.1.1.0/24"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT728 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT728
new file mode 100644
index 0000000..32ae31f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT728
@@ -0,0 +1,301 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/monitor-action-groups/azuredeploy.json",
+ "/demos/monitor-action-groups/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899750,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/monitor-action-groups/azuredeploy.json",
+ "/demos/monitor-action-groups/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT728",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.insights/actiongroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT728",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "16070852643720121598"
+ }
+ },
+ "parameters": {
+ "actionGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique name (within the Resource Group) for the Action group."
+ },
+ "value": "myActionGroup"
+ },
+ "actionGroupShortName": {
+ "type": "string",
+ "metadata": {
+ "description": "Short name (maximum 12 characters) for the Action group."
+ },
+ "value": "agShortName"
+ },
+ "emailReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of email receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "contosoEmail",
+ "emailAddress": "devops@contoso.com"
+ }
+ ]
+ },
+ "smsReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of SMS receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "smsReceiver",
+ "countryCode": "1",
+ "phoneNumber": "2134567891"
+ }
+ ]
+ },
+ "webhookReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of webhook receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "webhookReceiver",
+ "serviceUri": "https://webhookURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "itsmReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of ITSM receivers that are part of this action group"
+ },
+ "value": [
+ {
+ "name": "itsmReceiver",
+ "workspaceId": "GEN-UNIQUE-20",
+ "connectionId": "1234567890",
+ "ticketConfiguration": "1234567890",
+ "region": "eastus"
+ }
+ ]
+ },
+ "azureAppPushReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of AzureAppPush receivers that are part of this action group"
+ },
+ "value": [
+ {
+ "name": "azureAppPushReceiver",
+ "emailAddress": "devops@contoso.com"
+ }
+ ]
+ },
+ "automationRunbookReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of AutomationRunbook receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "automationRunbookReceiver",
+ "automationAccountId": "GEN-UNIQUE-30",
+ "runbookName": "AzureAutomationTutorialPython2",
+ "webhookResourceId": "GEN-UNIQUE-20",
+ "isGlobalRunbook": true,
+ "serviceUri": "https://automationServiceURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "voiceReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of voice receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "voiceReceiver",
+ "countryCode": "1",
+ "phoneNumber": "2134567891"
+ }
+ ]
+ },
+ "logicAppReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of logic app receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "logicAppReceiver",
+ "resourceId": "GEN-UNIQUE-20",
+ "callbackUrl": "https://callbackURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "azureFunctionReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of azure function receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "azureFunctionReceiver",
+ "functionAppResourceId": "GEN-UNIQUE-20",
+ "functionName": "myFunctionName",
+ "httpTriggerUrl": "https://triggerURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "armRoleReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of ARM role receivers that are part of this action group. Roles are Azure RBAC roles and only built-in roles are supported."
+ },
+ "value": [
+ {
+ "name": "armRoleReceiver",
+ "roleId": "GEN-UNIQUE-20",
+ "useCommonAlertSchema": true
+ }
+ ]
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "microsoft.insights/actionGroups",
+ "apiVersion": "2019-06-01",
+ "name": "myActionGroup",
+ "location": "Global",
+ "properties": {
+ "groupShortName": "agShortName",
+ "enabled": true,
+ "emailReceivers": [
+ {
+ "name": "contosoEmail",
+ "emailAddress": "devops@contoso.com"
+ }
+ ],
+ "smsReceivers": [
+ {
+ "name": "smsReceiver",
+ "countryCode": "1",
+ "phoneNumber": "2134567891"
+ }
+ ],
+ "webhookReceivers": [
+ {
+ "name": "webhookReceiver",
+ "serviceUri": "https://webhookURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "itsmReceivers": [
+ {
+ "name": "itsmReceiver",
+ "workspaceId": "GEN-UNIQUE-20",
+ "connectionId": "1234567890",
+ "ticketConfiguration": "1234567890",
+ "region": "eastus"
+ }
+ ],
+ "azureAppPushReceivers": [
+ {
+ "name": "azureAppPushReceiver",
+ "emailAddress": "devops@contoso.com"
+ }
+ ],
+ "automationRunbookReceivers": [
+ {
+ "name": "automationRunbookReceiver",
+ "automationAccountId": "GEN-UNIQUE-30",
+ "runbookName": "AzureAutomationTutorialPython2",
+ "webhookResourceId": "GEN-UNIQUE-20",
+ "isGlobalRunbook": true,
+ "serviceUri": "https://automationServiceURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "voiceReceivers": [
+ {
+ "name": "voiceReceiver",
+ "countryCode": "1",
+ "phoneNumber": "2134567891"
+ }
+ ],
+ "logicAppReceivers": [
+ {
+ "name": "logicAppReceiver",
+ "resourceId": "GEN-UNIQUE-20",
+ "callbackUrl": "https://callbackURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "azureFunctionReceivers": [
+ {
+ "name": "azureFunctionReceiver",
+ "functionAppResourceId": "GEN-UNIQUE-20",
+ "functionName": "myFunctionName",
+ "httpTriggerUrl": "https://triggerURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "armRoleReceivers": [
+ {
+ "name": "armRoleReceiver",
+ "roleId": "GEN-UNIQUE-20",
+ "useCommonAlertSchema": true
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "actionGroupId": {
+ "type": "string",
+ "value": "[resourceId('microsoft.insights/actionGroups', parameters('actionGroupName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT729 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT729
new file mode 100644
index 0000000..9aa432b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT729
@@ -0,0 +1,277 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/monitor-action-groups/azuredeploy.json",
+ "/demos/monitor-action-groups/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962899771,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/monitor-action-groups/azuredeploy.json",
+ "/demos/monitor-action-groups/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT729",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.insights/actiongroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT729",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "16070852643720121598"
+ }
+ },
+ "parameters": {
+ "actionGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique name (within the Resource Group) for the Action group."
+ },
+ "value": "myActionGroup"
+ },
+ "actionGroupShortName": {
+ "type": "string",
+ "metadata": {
+ "description": "Short name (maximum 12 characters) for the Action group."
+ },
+ "value": "agShortName"
+ },
+ "emailReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of email receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "contosoEmail",
+ "emailAddress": "devops@contoso.com"
+ }
+ ]
+ },
+ "smsReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of SMS receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "smsReceiver",
+ "countryCode": "1",
+ "phoneNumber": "2134567891"
+ }
+ ]
+ },
+ "webhookReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of webhook receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "webhookReceiver",
+ "serviceUri": "https://webhookURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "itsmReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of ITSM receivers that are part of this action group"
+ },
+ "value": [
+ {
+ "name": "itsmReceiver",
+ "workspaceId": "GEN-UNIQUE-20",
+ "connectionId": "1234567890",
+ "ticketConfiguration": "1234567890",
+ "region": "usgovvirginia"
+ }
+ ]
+ },
+ "azureAppPushReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of AzureAppPush receivers that are part of this action group"
+ }
+ },
+ "automationRunbookReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of AutomationRunbook receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "automationRunbookReceiver",
+ "automationAccountId": "GEN-UNIQUE-30",
+ "runbookName": "AzureAutomationTutorialPython2",
+ "webhookResourceId": "GEN-UNIQUE-20",
+ "isGlobalRunbook": true,
+ "serviceUri": "https://automationServiceURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "voiceReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of voice receivers that are part of this action group."
+ }
+ },
+ "logicAppReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of logic app receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "logicAppReceiver",
+ "resourceId": "GEN-UNIQUE-20",
+ "callbackUrl": "https://callbackURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "azureFunctionReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of azure function receivers that are part of this action group."
+ },
+ "value": [
+ {
+ "name": "azureFunctionReceiver",
+ "functionAppResourceId": "GEN-UNIQUE-20",
+ "functionName": "myFunctionName",
+ "httpTriggerUrl": "https://triggerURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ]
+ },
+ "armRoleReceivers": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The list of ARM role receivers that are part of this action group. Roles are Azure RBAC roles and only built-in roles are supported."
+ },
+ "value": [
+ {
+ "name": "armRoleReceiver",
+ "roleId": "GEN-UNIQUE-20",
+ "useCommonAlertSchema": true
+ }
+ ]
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "microsoft.insights/actionGroups",
+ "apiVersion": "2019-06-01",
+ "name": "myActionGroup",
+ "location": "Global",
+ "properties": {
+ "groupShortName": "agShortName",
+ "enabled": true,
+ "emailReceivers": [
+ {
+ "name": "contosoEmail",
+ "emailAddress": "devops@contoso.com"
+ }
+ ],
+ "smsReceivers": [
+ {
+ "name": "smsReceiver",
+ "countryCode": "1",
+ "phoneNumber": "2134567891"
+ }
+ ],
+ "webhookReceivers": [
+ {
+ "name": "webhookReceiver",
+ "serviceUri": "https://webhookURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "itsmReceivers": [
+ {
+ "name": "itsmReceiver",
+ "workspaceId": "GEN-UNIQUE-20",
+ "connectionId": "1234567890",
+ "ticketConfiguration": "1234567890",
+ "region": "usgovvirginia"
+ }
+ ],
+ "azureAppPushReceivers": [],
+ "automationRunbookReceivers": [
+ {
+ "name": "automationRunbookReceiver",
+ "automationAccountId": "GEN-UNIQUE-30",
+ "runbookName": "AzureAutomationTutorialPython2",
+ "webhookResourceId": "GEN-UNIQUE-20",
+ "isGlobalRunbook": true,
+ "serviceUri": "https://automationServiceURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "voiceReceivers": [],
+ "logicAppReceivers": [
+ {
+ "name": "logicAppReceiver",
+ "resourceId": "GEN-UNIQUE-20",
+ "callbackUrl": "https://callbackURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "azureFunctionReceivers": [
+ {
+ "name": "azureFunctionReceiver",
+ "functionAppResourceId": "GEN-UNIQUE-20",
+ "functionName": "myFunctionName",
+ "httpTriggerUrl": "https://triggerURI.contoso.com",
+ "useCommonAlertSchema": true
+ }
+ ],
+ "armRoleReceivers": [
+ {
+ "name": "armRoleReceiver",
+ "roleId": "GEN-UNIQUE-20",
+ "useCommonAlertSchema": true
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "actionGroupId": {
+ "type": "string",
+ "value": "[resourceId('microsoft.insights/actionGroups', parameters('actionGroupName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT73 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT73
new file mode 100644
index 0000000..bfc2533
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT73
@@ -0,0 +1,344 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/chef/multi-vm-chef-template-ubuntu-vm/azuredeploy.json",
+ "/application-workloads/chef/multi-vm-chef-template-ubuntu-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885385,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/chef/multi-vm-chef-template-ubuntu-vm/azuredeploy.json",
+ "/application-workloads/chef/multi-vm-chef-template-ubuntu-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT73",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT73",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmDnsName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS name for the VM"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "numberOfInstances": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "Number of VM instances to create, default is 2"
+ },
+ "value": 2
+ },
+ "availabilitySetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Availability Set name for the VMs"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin user name for the Virtual Machines"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "Canonical",
+ "metadata": {
+ "description": " Publisher for the OS image, the default is Canonical"
+ },
+ "value": "Canonical"
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "UbuntuServer",
+ "metadata": {
+ "description": "The name of the image offer. The default is Ubuntu"
+ },
+ "value": "UbuntuServer"
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "16.04-LTS",
+ "metadata": {
+ "description": "Version of the image. The default is 16.04-LTS"
+ },
+ "value": "16.04-LTS"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "VM Size"
+ }
+ },
+ "validation_client_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Validator key name for the organization. Example: myorg-validator"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "runlist": {
+ "type": "string",
+ "defaultValue": "recipe[getting-started::default]",
+ "metadata": {
+ "description": "Optional Run List to Execute"
+ },
+ "value": "recipe[getting-started]"
+ },
+ "validation_key": {
+ "type": "securestring",
+ "metadata": {
+ "description": "JSON Escaped Validation Key"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "vmExtensionName": "LinuxChefExtension",
+ "vmName": "GEN-UNIQUE-8",
+ "chef_server_url": "https://GEN-UNIQUE-8.cloudapp.net/organizations/Orgname",
+ "publicIPAddressName": "chefPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "virtualNetworkName": "MyVNET",
+ "addressPrefix": "10.0.0.0/16",
+ "subnet1Name": "subnet-1",
+ "subnet1Prefix": "10.0.0.0/24",
+ "nicName": "myVMNic",
+ "provider": "[toUpper('33194f91-eb5f-4110-827a-e95f640a9e46')]",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2021-07-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ },
+ "tags": {
+ "provider": "[toUpper('33194f91-eb5f-4110-827a-e95f640a9e46')]"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "chefPublicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "publicIPLoop",
+ "count": 2
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-8copyIndex()"
+ }
+ },
+ "tags": {
+ "provider": "[toUpper('33194f91-eb5f-4110-827a-e95f640a9e46')]"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ },
+ "tags": {
+ "provider": "[toUpper('33194f91-eb5f-4110-827a-e95f640a9e46')]"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNiccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/chefPublicIPcopyIndex()",
+ "Microsoft.Network/virtualNetworks/MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/chefPublicIPcopyIndex()"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//MyVNET/subnet-1"
+ }
+ }
+ }
+ ]
+ },
+ "tags": {
+ "provider": "[toUpper('33194f91-eb5f-4110-827a-e95f640a9e46')]"
+ }
+ },
+ {
+ "apiVersion": "2016-04-30-preview",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GEN-UNIQUE-8copyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/myVMNiccopyIndex()",
+ "Microsoft.Compute/availabilitySets/GEN-UNIQUE"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/GEN-UNIQUE"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE-8copyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNiccopyIndex()"
+ }
+ ]
+ }
+ },
+ "tags": {
+ "provider": "[toUpper('33194f91-eb5f-4110-827a-e95f640a9e46')]"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-8copyIndex()/LinuxChefExtension",
+ "apiVersion": "2016-04-30-preview",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "extensionLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE-8copyIndex()"
+ ],
+ "properties": {
+ "publisher": "Chef.Bootstrap.WindowsAzure",
+ "type": "LinuxChefClient",
+ "typeHandlerVersion": "1210.12",
+ "settings": {
+ "bootstrap_options": {
+ "chef_server_url": "https://GEN-UNIQUE-8.cloudapp.net/organizations/Orgname",
+ "validation_client_name": "GEN-UNIQUE"
+ },
+ "runlist": "recipe[getting-started]"
+ },
+ "protectedSettings": {
+ "validation_key": "GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT730 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT730
new file mode 100644
index 0000000..fcfe9b5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT730
@@ -0,0 +1,121 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/monitor-autoscale-alert/azuredeploy.json",
+ "/demos/monitor-autoscale-alert/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899788,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/monitor-autoscale-alert/azuredeploy.json",
+ "/demos/monitor-autoscale-alert/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT730",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.insights/activitylogalerts",
+ "microsoft.insights/actiongroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT730",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "actionGroupName": {
+ "type": "string",
+ "defaultValue": "autoscaleActionGroup",
+ "minLength": 1,
+ "metadata": {
+ "description": "Name for the Action group."
+ },
+ "value": "autoscaleActionGroup"
+ },
+ "actionGroupShortName": {
+ "type": "string",
+ "defaultValue": "autoscaleAG",
+ "minLength": 1,
+ "maxLength": 12,
+ "metadata": {
+ "description": "Short name for the Action group."
+ },
+ "value": "autoscaleAG"
+ },
+ "emailAddress": {
+ "type": "string",
+ "metadata": {
+ "description": "Email address."
+ },
+ "value": "someemail@contoso.com"
+ },
+ "activityLogAlertName": {
+ "type": "string",
+ "defaultValue": "autoscaleAlert",
+ "minLength": 1,
+ "metadata": {
+ "description": "Name for the Activity log alert."
+ },
+ "value": "autoscaleAlert"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Insights/actionGroups",
+ "apiVersion": "2019-06-01",
+ "name": "autoscaleActionGroup",
+ "location": "Global",
+ "properties": {
+ "groupShortName": "autoscaleAG",
+ "enabled": true,
+ "emailReceivers": [
+ {
+ "name": "emailReceiver",
+ "emailAddress": "someemail@contoso.com"
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Insights/activityLogAlerts",
+ "apiVersion": "2017-04-01",
+ "name": "autoscaleAlert",
+ "location": "Global",
+ "dependsOn": [
+ "autoscaleActionGroup"
+ ],
+ "properties": {
+ "enabled": true,
+ "scopes": [
+ "[subscription().id]"
+ ],
+ "condition": {
+ "allOf": [
+ {
+ "field": "Category",
+ "equals": "Autoscale"
+ }
+ ]
+ },
+ "actions": {
+ "actionGroups": [
+ {
+ "actionGroupId": "Microsoft.Insights/actionGroups/autoscaleActionGroup"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT731 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT731
new file mode 100644
index 0000000..6c7e88d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT731
@@ -0,0 +1,125 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/monitor-autoscale-failed-alert/azuredeploy.json",
+ "/demos/monitor-autoscale-failed-alert/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899796,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/monitor-autoscale-failed-alert/azuredeploy.json",
+ "/demos/monitor-autoscale-failed-alert/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT731",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.insights/activitylogalerts",
+ "microsoft.insights/actiongroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT731",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "actionGroupName": {
+ "type": "string",
+ "defaultValue": "autoscaleActionGroup",
+ "minLength": 1,
+ "metadata": {
+ "description": "Name for the Action group."
+ },
+ "value": "autoscaleActionGroup"
+ },
+ "actionGroupShortName": {
+ "type": "string",
+ "defaultValue": "autoscaleAG",
+ "minLength": 1,
+ "maxLength": 12,
+ "metadata": {
+ "description": "Short name for the Action group."
+ },
+ "value": "autoscaleAG"
+ },
+ "emailAddress": {
+ "type": "string",
+ "metadata": {
+ "description": "Email address."
+ },
+ "value": "someemail@contoso.com"
+ },
+ "activityLogAlertName": {
+ "type": "string",
+ "defaultValue": "autoscaleFailedAlert",
+ "minLength": 1,
+ "metadata": {
+ "description": "Name for the Activity log alert."
+ },
+ "value": "autoscaleFailedAlert"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Insights/actionGroups",
+ "apiVersion": "2019-06-01",
+ "name": "autoscaleActionGroup",
+ "location": "Global",
+ "properties": {
+ "groupShortName": "autoscaleAG",
+ "enabled": true,
+ "emailReceivers": [
+ {
+ "name": "emailReceiver",
+ "emailAddress": "someemail@contoso.com"
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Insights/activityLogAlerts",
+ "apiVersion": "2017-04-01",
+ "name": "autoscaleFailedAlert",
+ "location": "Global",
+ "dependsOn": [
+ "autoscaleActionGroup"
+ ],
+ "properties": {
+ "enabled": true,
+ "scopes": [
+ "[subscription().id]"
+ ],
+ "condition": {
+ "allOf": [
+ {
+ "field": "Category",
+ "equals": "Autoscale"
+ },
+ {
+ "field": "Status",
+ "equals": "Failed"
+ }
+ ]
+ },
+ "actions": {
+ "actionGroups": [
+ {
+ "actionGroupId": "Microsoft.Insights/actionGroups/autoscaleActionGroup"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT732 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT732
new file mode 100644
index 0000000..68b5d7e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT732
@@ -0,0 +1,410 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/monitor-autoscale-vmss-simplemetricbased/azuredeploy.json",
+ "/demos/monitor-autoscale-vmss-simplemetricbased/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899855,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/monitor-autoscale-vmss-simplemetricbased/azuredeploy.json",
+ "/demos/monitor-autoscale-vmss-simplemetricbased/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT732",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.compute/virtualmachinescalesets",
+ "microsoft.insights/autoscalesettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT732",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for the resources."
+ }
+ },
+ "vmSku": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "metadata": {
+ "description": "Size of VMs in the VM Scale Set."
+ },
+ "value": "Standard_A1"
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2016-Datacenter",
+ "allowedValues": [
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "2016-Datacenter",
+ "2016-Datacenter-Server-Core",
+ "2016-Datacenter-with-Containers"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM."
+ },
+ "value": "2012-R2-Datacenter"
+ },
+ "vmssName": {
+ "type": "string",
+ "metadata": {
+ "description": "String used as a base for naming resources. Must be 3-61 characters in length and globally unique across Azure."
+ },
+ "minLength": 3,
+ "maxLength": 61,
+ "value": "GEN-UNIQUE-32"
+ },
+ "instanceCount": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "Number of VM instances (1000 or less)."
+ },
+ "minValue": 1,
+ "maxValue": 1000
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username."
+ },
+ "value": "windows"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "minimumCapacity": {
+ "type": "Int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "The minimum capacity. Autoscale engine will ensure the instance count is at least this value."
+ },
+ "minValue": 1,
+ "maxValue": 1000
+ },
+ "maximumCapacity": {
+ "type": "Int",
+ "defaultValue": 10,
+ "metadata": {
+ "description": "The maximum capacity. Autoscale engine will ensure the instance count is not greater than this value."
+ },
+ "minValue": 1,
+ "maxValue": 1000
+ },
+ "defaultCapacity": {
+ "type": "Int",
+ "defaultValue": 10,
+ "metadata": {
+ "description": "The default capacity. Autoscale engine will preventively set the instance count to be this value if it can not find any metric data."
+ },
+ "minValue": 1,
+ "maxValue": 1000
+ },
+ "metricName": {
+ "type": "string",
+ "defaultValue": "Percentage CPU",
+ "metadata": {
+ "description": "The metric name."
+ }
+ },
+ "metricThresholdToScaleOut": {
+ "type": "Int",
+ "defaultValue": 60,
+ "metadata": {
+ "description": "The metric upper threshold. If the metric value is above this threshold then autoscale engine will initiate scale out action."
+ }
+ },
+ "metricThresholdToScaleIn": {
+ "type": "Int",
+ "defaultValue": 20,
+ "metadata": {
+ "description": "The metric lower threshold. If the metric value is below this threshold then autoscale engine will initiate scale in action."
+ }
+ },
+ "changePercentScaleOut": {
+ "type": "Int",
+ "defaultValue": 20,
+ "metadata": {
+ "description": "The percentage to increase the instance count when autoscale engine is initiating scale out action."
+ }
+ },
+ "changePercentScaleIn": {
+ "type": "Int",
+ "defaultValue": 10,
+ "metadata": {
+ "description": "The percentage to decrease the instance count when autoscale engine is initiating scale in action."
+ }
+ },
+ "autoscaleEnabled": {
+ "type": "Bool",
+ "metadata": {
+ "description": "A boolean to indicate whether the autoscale policy is enabled or disabled."
+ },
+ "value": true
+ }
+ },
+ "variables": {
+ "settingName": "[concat(toLower(variables('namingInfix')), '-setting')]",
+ "namingInfix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "longNamingInfix": "[toLower(parameters('vmssName'))]",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/24",
+ "virtualNetworkName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "publicIPAddressName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "subnetName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "loadBalancerName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb",
+ "natPoolName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]natpool",
+ "bePoolName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool",
+ "natStartPort": 50000,
+ "natEndPort": 50119,
+ "natBackendPort": 3389,
+ "nicName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "ipConfigName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "frontEndIPConfigID": "Microsoft.Network/loadBalancers/frontendIpConfigurations/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/loadBalancerFrontEnd",
+ "osType": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(parameters('vmssName'))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/loadBalancers",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool"
+ }
+ ],
+ "inboundNatPools": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]natpool",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/loadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPortRangeStart": 50000,
+ "frontendPortRangeEnd": 50119,
+ "backendPort": 3389
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers//[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb",
+ "Microsoft.Network/virtualNetworks//[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet"
+ ],
+ "sku": {
+ "name": "Standard_A1",
+ "tier": "Standard",
+ "capacity": 2
+ },
+ "properties": {
+ "overprovision": true,
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "caching": "ReadWrite"
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "adminUsername": "windows",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool"
+ }
+ ],
+ "loadBalancerInboundNatPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatPools/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]natpool"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Insights/autoscalesettings",
+ "name": "[variables('settingName')]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachineScaleSets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]"
+ ],
+ "apiVersion": "2015-04-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "profiles": [
+ {
+ "name": "DefaultAutoscaleProfile",
+ "capacity": {
+ "minimum": 2,
+ "maximum": 10,
+ "default": 10
+ },
+ "rules": [
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricResourceUri": "Microsoft.Compute/virtualMachineScaleSets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "timeGrain": "PT5M",
+ "statistic": "Average",
+ "timeWindow": "PT10M",
+ "timeAggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 60
+ },
+ "scaleAction": {
+ "direction": "Increase",
+ "type": "PercentChangeCount",
+ "value": 20,
+ "cooldown": "PT10M"
+ }
+ },
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricResourceUri": "Microsoft.Compute/virtualMachineScaleSets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "timeGrain": "PT5M",
+ "statistic": "Average",
+ "timeWindow": "PT10M",
+ "timeAggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 20
+ },
+ "scaleAction": {
+ "direction": "Decrease",
+ "type": "PercentChangeCount",
+ "value": 10,
+ "cooldown": "PT10M"
+ }
+ }
+ ]
+ }
+ ],
+ "enabled": true,
+ "targetResourceUri": "Microsoft.Compute/virtualMachineScaleSets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT733 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT733
new file mode 100644
index 0000000..5583743
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT733
@@ -0,0 +1,215 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/monitor-autoscale-webappserviceplan-simplemetricbased/azuredeploy.json",
+ "/demos/monitor-autoscale-webappserviceplan-simplemetricbased/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899908,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/monitor-autoscale-webappserviceplan-simplemetricbased/azuredeploy.json",
+ "/demos/monitor-autoscale-webappserviceplan-simplemetricbased/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT733",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.insights/autoscalesettings",
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT733",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "svcPlanName": {
+ "type": "string",
+ "defaultValue": "SampleAppServicePlan",
+ "metadata": {
+ "description": "The name of the App Service plan."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The pricing tier for the App Service plan."
+ },
+ "value": "Standard"
+ },
+ "svcPlanSize": {
+ "defaultValue": "S1",
+ "type": "string",
+ "metadata": {
+ "description": "The instance size of the app."
+ },
+ "value": "S1"
+ },
+ "minimumCapacity": {
+ "type": "Int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "The minimum capacity. Autoscale engine will ensure the instance count is at least this value."
+ }
+ },
+ "maximumCapacity": {
+ "type": "Int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "The maximum capacity. Autoscale engine will ensure the instance count is not greater than this value."
+ }
+ },
+ "defaultCapacity": {
+ "type": "Int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "The default capacity. Autoscale engine will preventively set the instance count to be this value if it can not find any metric data."
+ }
+ },
+ "metricName": {
+ "type": "string",
+ "defaultValue": "CpuPercentage",
+ "metadata": {
+ "description": "The metric name."
+ }
+ },
+ "metricThresholdToScaleOut": {
+ "type": "Int",
+ "defaultValue": 60,
+ "metadata": {
+ "description": "The metric upper threshold. If the metric value is above this threshold then autoscale engine will initiate scale out action."
+ }
+ },
+ "metricThresholdToScaleIn": {
+ "type": "Int",
+ "defaultValue": 20,
+ "metadata": {
+ "description": "The metric lower threshold. If the metric value is below this threshold then autoscale engine will initiate scale in action."
+ }
+ },
+ "changePercentScaleOut": {
+ "type": "Int",
+ "defaultValue": 20,
+ "metadata": {
+ "description": "The percentage to increase the instance count when autoscale engine is initiating scale out action."
+ }
+ },
+ "changePercentScaleIn": {
+ "type": "Int",
+ "defaultValue": 10,
+ "metadata": {
+ "description": "The percentage to decrease the instance count when autoscale engine is initiating scale in action."
+ }
+ },
+ "autoscaleEnabled": {
+ "type": "Bool",
+ "metadata": {
+ "description": "A boolean to indicate whether the autoscale policy is enabled or disabled."
+ },
+ "value": true
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for resources."
+ }
+ }
+ },
+ "variables": {
+ "settingName": "[concat(toLower(parameters('svcPlanName')), '-setting')]",
+ "targetResourceId": "Microsoft.Web/serverFarms//GEN-UNIQUE-8"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/serverfarms",
+ "apiVersion": "2020-12-01",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "S1",
+ "tier": "Standard",
+ "capacity": 1
+ }
+ },
+ {
+ "type": "Microsoft.Insights/autoscalesettings",
+ "name": "[variables('settingName')]",
+ "dependsOn": [
+ "Microsoft.Web/serverfarms/GEN-UNIQUE-8"
+ ],
+ "apiVersion": "2014-04-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "profiles": [
+ {
+ "name": "DefaultAutoscaleProfile",
+ "capacity": {
+ "minimum": 2,
+ "maximum": 5,
+ "default": 5
+ },
+ "rules": [
+ {
+ "metricTrigger": {
+ "metricName": "CpuPercentage",
+ "metricResourceUri": "Microsoft.Web/serverFarms//GEN-UNIQUE-8",
+ "timeGrain": "PT5M",
+ "statistic": "Average",
+ "timeWindow": "PT10M",
+ "timeAggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 60
+ },
+ "scaleAction": {
+ "direction": "Increase",
+ "type": "PercentChangeCount",
+ "value": 20,
+ "cooldown": "PT10M"
+ }
+ },
+ {
+ "metricTrigger": {
+ "metricName": "CpuPercentage",
+ "metricResourceUri": "Microsoft.Web/serverFarms//GEN-UNIQUE-8",
+ "timeGrain": "PT5M",
+ "statistic": "Average",
+ "timeWindow": "PT10M",
+ "timeAggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 20
+ },
+ "scaleAction": {
+ "direction": "Decrease",
+ "type": "PercentChangeCount",
+ "value": 10,
+ "cooldown": "PT10M"
+ }
+ }
+ ]
+ }
+ ],
+ "enabled": true,
+ "targetResourceUri": "Microsoft.Web/serverFarms//GEN-UNIQUE-8"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT734 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT734
new file mode 100644
index 0000000..9fd2343
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT734
@@ -0,0 +1,121 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/monitor-servicehealth-alert/azuredeploy.json",
+ "/demos/monitor-servicehealth-alert/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962899955,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/monitor-servicehealth-alert/azuredeploy.json",
+ "/demos/monitor-servicehealth-alert/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT734",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.insights/activitylogalerts",
+ "microsoft.insights/actiongroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT734",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "actionGroupName": {
+ "type": "string",
+ "defaultValue": "serviceHealthActionGroup",
+ "minLength": 1,
+ "metadata": {
+ "description": "Name for the Action group."
+ },
+ "value": "serviceHealthActionGroup"
+ },
+ "actionGroupShortName": {
+ "type": "string",
+ "defaultValue": "serviceAG",
+ "minLength": 1,
+ "maxLength": 12,
+ "metadata": {
+ "description": "Short name for the Action group."
+ },
+ "value": "serviceAG"
+ },
+ "emailAddress": {
+ "type": "string",
+ "metadata": {
+ "description": "Email address."
+ },
+ "value": "someemail@contoso.com"
+ },
+ "activityLogAlertName": {
+ "type": "string",
+ "defaultValue": "serviceHealthAlert",
+ "minLength": 1,
+ "metadata": {
+ "description": "Name for the Activity log alert."
+ },
+ "value": "serviceHealthAlert"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Insights/actionGroups",
+ "apiVersion": "2019-06-01",
+ "name": "serviceHealthActionGroup",
+ "location": "Global",
+ "properties": {
+ "groupShortName": "serviceAG",
+ "enabled": true,
+ "emailReceivers": [
+ {
+ "name": "emailReceiver",
+ "emailAddress": "someemail@contoso.com"
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Insights/activityLogAlerts",
+ "apiVersion": "2017-04-01",
+ "name": "serviceHealthAlert",
+ "location": "Global",
+ "dependsOn": [
+ "serviceHealthActionGroup"
+ ],
+ "properties": {
+ "enabled": true,
+ "scopes": [
+ "[subscription().id]"
+ ],
+ "condition": {
+ "allOf": [
+ {
+ "field": "category",
+ "equals": "ServiceHealth"
+ }
+ ]
+ },
+ "actions": {
+ "actionGroups": [
+ {
+ "actionGroupId": "Microsoft.Insights/actionGroups/serviceHealthActionGroup"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT737 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT737
new file mode 100644
index 0000000..9889daf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT737
@@ -0,0 +1,801 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/multi-tier-service-networking/azuredeploy.json",
+ "/demos/multi-tier-service-networking/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900389,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/multi-tier-service-networking/azuredeploy.json",
+ "/demos/multi-tier-service-networking/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT737",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.network/applicationgateways",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT737",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "newDBStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Storage Account where the DB Virtual Machine disks will be placed."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "narayan"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "appVmNamePrefix": {
+ "type": "string",
+ "defaultValue": "MultiTierApp",
+ "metadata": {
+ "description": "Prefix for the name of Application servers"
+ }
+ },
+ "dbVmNamePrefix": {
+ "type": "string",
+ "defaultValue": "MultiTierDB",
+ "metadata": {
+ "description": "Prefix for the name of Database servers"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the VM"
+ }
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic",
+ "Static"
+ ],
+ "metadata": {
+ "description": "Type of public IP address"
+ }
+ },
+ "appServersPublicIPPrefix": {
+ "type": "string",
+ "defaultValue": "appserverpubIP",
+ "metadata": {
+ "description": "Prefix for the name of Database servers"
+ }
+ },
+ "skuName": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_Small",
+ "Standard_Medium",
+ "Standard_Large"
+ ],
+ "defaultValue": "Standard_Medium",
+ "metadata": {
+ "description": "Sku Name"
+ }
+ },
+ "appGatewayCapacity": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "Number of instances of the Application Gateway"
+ }
+ },
+ "multitierILB": {
+ "type": "string",
+ "defaultValue": "ILBforSql",
+ "metadata": {
+ "description": "Internal Load Balancer name"
+ }
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2019-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "2016-Datacenter",
+ "2019-Datacenter"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter, 2016-Datacenter, 2019-Datacenter."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "storageAccountType": "Standard_LRS",
+ "VNetName": "multiTierVNet",
+ "FESubnetName": "FrontendSubnet",
+ "AppSubnetName": "AppSubnet",
+ "BESubnetName": "BackendSubnet",
+ "VNetAddressPrefix": "10.1.0.0/16",
+ "FrontendPrefix": "10.1.0.0/24",
+ "AppPrefix": "10.1.1.0/24",
+ "BackendPrefix": "10.1.2.0/24",
+ "appAvailabilitySetName": "appAvSet",
+ "AppServerIP1": "10.1.1.4",
+ "AppServerIP2": "10.1.1.5",
+ "FeNsgname": "FrontendNSG",
+ "AppNsgname": "AppNSG",
+ "BeNsgname": "BackendNSG",
+ "appGatewayName": "multitierAppGateway",
+ "appGatewayPubIPName": "multitierAppGatewayIP",
+ "ILBIP": "10.1.2.100",
+ "appNicName": "appNic",
+ "dbNicName": "dbNic",
+ "appScaleCount": 2,
+ "dbSclaeCount": 3,
+ "dbAvailabilitySetName": "DbAvlSet"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE-8",
+ "apiVersion": "2019-06-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "multitierAppGatewayIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "appserverpubIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "foo",
+ "count": 2
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "multiTierVNet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups//FrontendNSG",
+ "Microsoft.Network/networkSecurityGroups//AppNSG",
+ "Microsoft.Network/networkSecurityGroups//BackendNSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.1.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "FrontendSubnet",
+ "properties": {
+ "addressPrefix": "10.1.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/FrontendNSG"
+ }
+ }
+ },
+ {
+ "name": "AppSubnet",
+ "properties": {
+ "addressPrefix": "10.1.1.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/AppNSG"
+ }
+ }
+ },
+ {
+ "name": "BackendSubnet",
+ "properties": {
+ "addressPrefix": "10.1.2.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/BackendNSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "FrontendNSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "rdp_rule",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "web_rule",
+ "properties": {
+ "description": "Allow Website",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "App_subnet_rule",
+ "properties": {
+ "description": "Outbound to App",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "10.1.1.0/24",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Block_Internal_Network",
+ "properties": {
+ "description": "Outbound to Internal Network",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Deny",
+ "priority": 2000,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "AppNSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "fe_rule",
+ "properties": {
+ "description": "Allow Frontend",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "10.1.0.0/24",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "rdp_rule",
+ "properties": {
+ "description": "Allow RDP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "vnet_rule",
+ "properties": {
+ "description": "Block Internal Network",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 300,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "DB_outbound_rule",
+ "properties": {
+ "description": "Allow Outbound DB",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "10.1.2.0/24",
+ "access": "Allow",
+ "priority": 1000,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Deny_Internet",
+ "properties": {
+ "description": "Deny_Internet",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "Internet",
+ "access": "Deny",
+ "priority": 2000,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "BackendNSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "app_rule",
+ "properties": {
+ "description": "Allow App servers",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "10.1.1.0/24",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "vnet_rule",
+ "properties": {
+ "description": "Block Internal Network",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Deny_Internet",
+ "properties": {
+ "description": "Deny_Internet",
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "Internet",
+ "access": "Deny",
+ "priority": 1000,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "name": "multitierAppGateway",
+ "type": "Microsoft.Network/applicationGateways",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//multiTierVNet",
+ "Microsoft.Network/publicIPAddresses//multitierAppGatewayIP"
+ ],
+ "properties": {
+ "sku": {
+ "name": "Standard_Medium",
+ "tier": "Standard",
+ "capacity": 2
+ },
+ "gatewayIPConfigurations": [
+ {
+ "name": "appGatewayIpConfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//multiTierVNet/FrontendSubnet"
+ }
+ }
+ }
+ ],
+ "frontendIPConfigurations": [
+ {
+ "name": "appGatewayFrontendIP",
+ "properties": {
+ "PublicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/multitierAppGatewayIP"
+ }
+ }
+ }
+ ],
+ "frontendPorts": [
+ {
+ "name": "appGatewayFrontendPort",
+ "properties": {
+ "Port": 80
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "appGatewayBackendPool",
+ "properties": {
+ "BackendAddresses": [
+ {
+ "IpAddress": "10.1.1.4"
+ },
+ {
+ "IpAddress": "10.1.1.5"
+ }
+ ]
+ }
+ }
+ ],
+ "backendHttpSettingsCollection": [
+ {
+ "name": "appGatewayBackendHttpSettings",
+ "properties": {
+ "Port": 80,
+ "Protocol": "Http",
+ "CookieBasedAffinity": "Enabled"
+ }
+ }
+ ],
+ "httpListeners": [
+ {
+ "name": "appGatewayHttpListener",
+ "properties": {
+ "FrontendIPConfiguration": {
+ "id": "Microsoft.Network/applicationGateways/frontendIPConfigurations//multitierAppGateway/appGatewayFrontendIP"
+ },
+ "FrontendPort": {
+ "id": "Microsoft.Network/applicationGateways/frontendPorts//multitierAppGateway/appGatewayFrontendPort"
+ },
+ "Protocol": "Http"
+ }
+ }
+ ],
+ "requestRoutingRules": [
+ {
+ "Name": "rule1",
+ "properties": {
+ "RuleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners//multitierAppGateway/appGatewayHttpListener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools//multitierAppGateway/appGatewayBackendPool"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection//multitierAppGateway/appGatewayBackendHttpSettings"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "name": "ILBforSql",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//multiTierVNet"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//multiTierVNet/BackendSubnet"
+ },
+ "privateIPAddress": "10.1.2.100",
+ "privateIPAllocationMethod": "Static"
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "BackendPool1"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "LBRule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/ILBforSql/LoadBalancerFrontEnd"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/ILBforSql/BackendPool1"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 1433,
+ "backendPort": 1433,
+ "enableFloatingIP": true,
+ "idleTimeoutInMinutes": 5,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/ILBforSql/tcpProbe"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "tcpProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 1433,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "appNiccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "foo",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//appserverpubIPcopyIndex()",
+ "Microsoft.Network/virtualNetworks//multiTierVNet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat('10.1.1.', copyIndex(4))]",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/appserverpubIPcopyIndex()"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//multiTierVNet/AppSubnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "dbNiccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "foo",
+ "count": 3
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//multiTierVNet",
+ "Microsoft.Network/loadBalancers//ILBforSql"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat('10.1.2.', copyIndex(4))]",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//multiTierVNet/BackendSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/ILBforSql/BackendPool1"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "appAvSet",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MultiTierAppcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "foo",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//appNiccopyIndex()",
+ "Microsoft.Compute/availabilitySets//appAvSet"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/appAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "MultiTierAppcopyIndex()",
+ "adminUsername": "narayan",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/appNiccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "DbAvlSet",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MultiTierDBcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "foo",
+ "count": 3
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//dbNiccopyIndex()",
+ "Microsoft.Compute/availabilitySets//DbAvlSet"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/DbAvlSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "MultiTierDBcopyIndex()",
+ "adminUsername": "narayan",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dbNiccopyIndex()"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT738 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT738
new file mode 100644
index 0000000..fa0f7b4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT738
@@ -0,0 +1,1022 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/nested-vms-in-virtual-network/azuredeploy.json",
+ "/demos/nested-vms-in-virtual-network/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900500,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/nested-vms-in-virtual-network/azuredeploy.json",
+ "/demos/nested-vms-in-virtual-network/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT738",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.resources/deployments",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT738",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "4253688112151179551"
+ }
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "secureString",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "HostPublicIPAddressName": {
+ "type": "string",
+ "defaultValue": "HVHOSTPIP",
+ "metadata": {
+ "description": "Resource Name for Public IP address attached to Hyper-V Host"
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "VirtualNetwork",
+ "metadata": {
+ "description": "Hyper-V Host and Guest VMs Virtual Network"
+ }
+ },
+ "virtualNetworkAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/22",
+ "metadata": {
+ "description": "Virtual Network Address Space"
+ }
+ },
+ "NATSubnetName": {
+ "type": "string",
+ "defaultValue": "NAT",
+ "metadata": {
+ "description": "NAT Subnet Name"
+ }
+ },
+ "NATSubnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "NAT Subnet Address Space"
+ }
+ },
+ "hyperVSubnetName": {
+ "type": "string",
+ "defaultValue": "Hyper-V-LAN",
+ "metadata": {
+ "description": "Hyper-V Host Subnet Name"
+ }
+ },
+ "hyperVSubnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.1.0/24",
+ "metadata": {
+ "description": "Hyper-V Host Subnet Address Space"
+ }
+ },
+ "ghostedSubnetName": {
+ "type": "string",
+ "defaultValue": "Ghosted",
+ "metadata": {
+ "description": "Ghosted Subnet Name"
+ }
+ },
+ "ghostedSubnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.2.0/24",
+ "metadata": {
+ "description": "Ghosted Subnet Address Space"
+ }
+ },
+ "azureVMsSubnetName": {
+ "type": "string",
+ "defaultValue": "Azure-VMs",
+ "metadata": {
+ "description": "Azure VMs Subnet Name"
+ }
+ },
+ "azureVMsSubnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.3.0/24",
+ "metadata": {
+ "description": "Azure VMs Address Space"
+ }
+ },
+ "HostNetworkInterface1Name": {
+ "type": "string",
+ "defaultValue": "HVHOSTNIC1",
+ "metadata": {
+ "description": "Hyper-V Host Network Interface 1 Name, attached to NAT Subnet"
+ }
+ },
+ "HostNetworkInterface2Name": {
+ "type": "string",
+ "defaultValue": "HVHOSTNIC2",
+ "metadata": {
+ "description": "Hyper-V Host Network Interface 2 Name, attached to Hyper-V LAN Subnet"
+ }
+ },
+ "HostVirtualMachineName": {
+ "type": "string",
+ "defaultValue": "HVHOST",
+ "maxLength": 15,
+ "metadata": {
+ "description": "Name of Hyper-V Host Virtual Machine, Maximum of 15 characters, use letters and numbers only."
+ }
+ },
+ "HostVirtualMachineSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4s_v3",
+ "allowedValues": [
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D16_v3",
+ "Standard_D32_v3",
+ "Standard_D2s_v3",
+ "Standard_D4s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D32s_v3",
+ "Standard_D64_v3",
+ "Standard_E2_v3",
+ "Standard_E4_v3",
+ "Standard_E8_v3",
+ "Standard_E16_v3",
+ "Standard_E32_v3",
+ "Standard_E64_v3",
+ "Standard_D64s_v3",
+ "Standard_E2s_v3",
+ "Standard_E4s_v3",
+ "Standard_E8s_v3",
+ "Standard_E16s_v3",
+ "Standard_E32s_v3",
+ "Standard_E64s_v3"
+ ],
+ "metadata": {
+ "description": "Size of the Host Virtual Machine"
+ }
+ },
+ "HostAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin Username for the Host Virtual Machine"
+ }
+ },
+ "HostAdminPassword": {
+ "type": "secureString",
+ "metadata": {
+ "description": "Admin User Password for the Host Virtual Machine"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "HostAdminUserName": {
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "functions": [],
+ "variables": {
+ "NATSubnetNSGName": "[format('{0}NSG', parameters('NATSubnetName'))]",
+ "hyperVSubnetNSGName": "[format('{0}NSG', parameters('hyperVSubnetName'))]",
+ "ghostedSubnetNSGName": "[format('{0}NSG', parameters('ghostedSubnetName'))]",
+ "azureVMsSubnetNSGName": "[format('{0}NSG', parameters('azureVMsSubnetName'))]",
+ "azureVMsSubnetUDRName": "[format('{0}UDR', parameters('azureVMsSubnetName'))]",
+ "DSCInstallWindowsFeaturesUri": "[uri(parameters('_artifactsLocation'), format('dsc/dscinstallwindowsfeatures.zip{0}', parameters('_artifactsLocationSasToken')))]",
+ "HVHostSetupScriptUri": "[uri(parameters('_artifactsLocation'), format('hvhostsetup.ps1{0}', parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2021-02-01",
+ "name": "HVHOSTPIP",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Basic"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(format('{0}-{1}', parameters('HostVirtualMachineName'), uniqueString(resourceGroup().id)))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2021-02-01",
+ "name": "[format('{0}NSG', parameters('NATSubnetName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2021-02-01",
+ "name": "[format('{0}NSG', parameters('hyperVSubnetName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2021-02-01",
+ "name": "[format('{0}NSG', parameters('ghostedSubnetName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2021-02-01",
+ "name": "[format('{0}NSG', parameters('azureVMsSubnetName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2021-02-01",
+ "name": "VirtualNetwork",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/22"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "NAT",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('NATSubnetName'))]"
+ }
+ }
+ },
+ {
+ "name": "Hyper-V-LAN",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('hyperVSubnetName'))]"
+ }
+ }
+ },
+ {
+ "name": "Ghosted",
+ "properties": {
+ "addressPrefix": "10.0.2.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('ghostedSubnetName'))]"
+ }
+ }
+ },
+ {
+ "name": "Azure-VMs",
+ "properties": {
+ "addressPrefix": "10.0.3.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('azureVMsSubnetName'))]"
+ },
+ "routeTable": {
+ "id": "[reference(resourceId('Microsoft.Resources/deployments', 'udrDeploy'), '2019-10-01').outputs.udrId.value]"
+ }
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('azureVMsSubnetName'))]",
+ "Microsoft.Resources/deployments/udrDeploy",
+ "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('ghostedSubnetName'))]",
+ "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('hyperVSubnetName'))]",
+ "Microsoft.Network/networkSecurityGroups/[format('{0}NSG', parameters('NATSubnetName'))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2021-03-01",
+ "name": "HVHOST",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4s_v3"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[format('{0}OsDisk', parameters('HostVirtualMachineName'))]",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ },
+ "caching": "ReadWrite"
+ },
+ "dataDisks": [
+ {
+ "lun": 0,
+ "name": "[format('{0}DataDisk1', parameters('HostVirtualMachineName'))]",
+ "createOption": "Empty",
+ "diskSizeGB": 1024,
+ "caching": "ReadOnly",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ ]
+ },
+ "osProfile": {
+ "computerName": "HVHOST",
+ "adminUsername": "HostAdminUsername",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[reference(resourceId('Microsoft.Resources/deployments', 'createNic1'), '2019-10-01').outputs.nicId.value]",
+ "properties": {
+ "primary": true
+ }
+ },
+ {
+ "id": "[reference(resourceId('Microsoft.Resources/deployments', 'createNic2'), '2019-10-01').outputs.nicId.value]",
+ "properties": {
+ "primary": false
+ }
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/createNic1",
+ "Microsoft.Resources/deployments/createNic2"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2021-03-01",
+ "name": "[format('{0}/{1}', parameters('HostVirtualMachineName'), 'InstallWindowsFeatures')]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.77",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "wmfVersion": "latest",
+ "configuration": {
+ "url": "[uri(parameters('_artifactsLocation'), format('dsc/dscinstallwindowsfeatures.zip{0}', parameters('_artifactsLocationSasToken')))]",
+ "script": "DSCInstallWindowsFeatures.ps1",
+ "function": "InstallWindowsFeatures"
+ }
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/HVHOST"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2021-03-01",
+ "name": "[format('{0}/{1}', parameters('HostVirtualMachineName'), 'HVHOSTSetup')]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.9",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), format('hvhostsetup.ps1{0}', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[format('powershell -ExecutionPolicy Unrestricted -File HVHostSetup.ps1 -NIC1IPAddress {0} -NIC2IPAddress {1} -GhostedSubnetPrefix {2} -VirtualNetworkPrefix {3}', reference(resourceId('Microsoft.Resources/deployments', 'createNic1'), '2019-10-01').outputs.assignedIp.value, reference(resourceId('Microsoft.Resources/deployments', 'createNic2'), '2019-10-01').outputs.assignedIp.value, parameters('ghostedSubnetPrefix'), parameters('virtualNetworkAddressPrefix'))]"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/createNic1",
+ "Microsoft.Resources/deployments/createNic2",
+ "Microsoft.Compute/virtualMachines/HVHOST",
+ "Microsoft.Compute/virtualMachines/extensions/HVHOST/InstallWindowsFeatures"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "createNic1",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "nicName": {
+ "value": "HVHOSTNIC1"
+ },
+ "subnetId": {
+ "value": "[format('{0}/subnets/{1}', resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName')), parameters('NATSubnetName'))]"
+ },
+ "pipId": {
+ "value": "Microsoft.Network/publicIPAddresses/HVHOSTPIP"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "15585594711656125126"
+ }
+ },
+ "parameters": {
+ "nicName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "subnetId": {
+ "type": "string"
+ },
+ "pipId": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ipAllocationMethod": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic",
+ "Static"
+ ]
+ },
+ "staticIpAddress": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "enableIPForwarding": {
+ "type": "bool",
+ "defaultValue": false
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "nicName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "primary": true,
+ "privateIPAllocationMethod": "ipAllocationMethod",
+ "privateIPAddress": "staticIpAddress",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "publicIPAddress": "[if(equals(parameters('pipId'), ''), null(), createObject('id', parameters('pipId')))]"
+ }
+ }
+ ],
+ "enableIPForwarding": "enableIPForwarding"
+ }
+ }
+ ],
+ "outputs": {
+ "nicId": {
+ "type": "string",
+ "value": "Microsoft.Network/networkInterfaces/nicName"
+ },
+ "assignedIp": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', parameters('nicName'))).ipConfigurations[0].properties.privateIPAddress]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/HVHOSTPIP",
+ "Microsoft.Network/virtualNetworks/VirtualNetwork"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "createNic2",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "nicName": {
+ "value": "HVHOSTNIC2"
+ },
+ "enableIPForwarding": {
+ "value": true
+ },
+ "subnetId": {
+ "value": "[format('{0}/subnets/{1}', resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName')), parameters('hyperVSubnetName'))]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "15585594711656125126"
+ }
+ },
+ "parameters": {
+ "nicName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "subnetId": {
+ "type": "string"
+ },
+ "pipId": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ipAllocationMethod": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic",
+ "Static"
+ ]
+ },
+ "staticIpAddress": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "enableIPForwarding": {
+ "type": "bool",
+ "defaultValue": false
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "nicName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "primary": true,
+ "privateIPAllocationMethod": "ipAllocationMethod",
+ "privateIPAddress": "staticIpAddress",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "publicIPAddress": "[if(equals(parameters('pipId'), ''), null(), createObject('id', parameters('pipId')))]"
+ }
+ }
+ ],
+ "enableIPForwarding": "enableIPForwarding"
+ }
+ }
+ ],
+ "outputs": {
+ "nicId": {
+ "type": "string",
+ "value": "Microsoft.Network/networkInterfaces/nicName"
+ },
+ "assignedIp": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', parameters('nicName'))).ipConfigurations[0].properties.privateIPAddress]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/VirtualNetwork"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "updateNic1",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "ipAllocationMethod": {
+ "value": "Static"
+ },
+ "staticIpAddress": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'createNic1'), '2019-10-01').outputs.assignedIp.value]"
+ },
+ "nicName": {
+ "value": "HVHOSTNIC1"
+ },
+ "subnetId": {
+ "value": "[format('{0}/subnets/{1}', resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName')), parameters('NATSubnetName'))]"
+ },
+ "pipId": {
+ "value": "Microsoft.Network/publicIPAddresses/HVHOSTPIP"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "15585594711656125126"
+ }
+ },
+ "parameters": {
+ "nicName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "subnetId": {
+ "type": "string"
+ },
+ "pipId": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ipAllocationMethod": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic",
+ "Static"
+ ]
+ },
+ "staticIpAddress": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "enableIPForwarding": {
+ "type": "bool",
+ "defaultValue": false
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "nicName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "primary": true,
+ "privateIPAllocationMethod": "ipAllocationMethod",
+ "privateIPAddress": "staticIpAddress",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "publicIPAddress": "[if(equals(parameters('pipId'), ''), null(), createObject('id', parameters('pipId')))]"
+ }
+ }
+ ],
+ "enableIPForwarding": "enableIPForwarding"
+ }
+ }
+ ],
+ "outputs": {
+ "nicId": {
+ "type": "string",
+ "value": "Microsoft.Network/networkInterfaces/nicName"
+ },
+ "assignedIp": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', parameters('nicName'))).ipConfigurations[0].properties.privateIPAddress]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/createNic1",
+ "Microsoft.Network/publicIPAddresses/HVHOSTPIP",
+ "Microsoft.Network/virtualNetworks/VirtualNetwork"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "updateNic2",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "ipAllocationMethod": {
+ "value": "Static"
+ },
+ "staticIpAddress": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'createNic2'), '2019-10-01').outputs.assignedIp.value]"
+ },
+ "nicName": {
+ "value": "HVHOSTNIC2"
+ },
+ "enableIPForwarding": {
+ "value": true
+ },
+ "subnetId": {
+ "value": "[format('{0}/subnets/{1}', resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworkName')), parameters('hyperVSubnetName'))]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "15585594711656125126"
+ }
+ },
+ "parameters": {
+ "nicName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "subnetId": {
+ "type": "string"
+ },
+ "pipId": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "ipAllocationMethod": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic",
+ "Static"
+ ]
+ },
+ "staticIpAddress": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "enableIPForwarding": {
+ "type": "bool",
+ "defaultValue": false
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "nicName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "primary": true,
+ "privateIPAllocationMethod": "ipAllocationMethod",
+ "privateIPAddress": "staticIpAddress",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "publicIPAddress": "[if(equals(parameters('pipId'), ''), null(), createObject('id', parameters('pipId')))]"
+ }
+ }
+ ],
+ "enableIPForwarding": "enableIPForwarding"
+ }
+ }
+ ],
+ "outputs": {
+ "nicId": {
+ "type": "string",
+ "value": "Microsoft.Network/networkInterfaces/nicName"
+ },
+ "assignedIp": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', parameters('nicName'))).ipConfigurations[0].properties.privateIPAddress]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/createNic2",
+ "Microsoft.Network/virtualNetworks/VirtualNetwork"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "udrDeploy",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "udrName": {
+ "value": "[format('{0}UDR', parameters('azureVMsSubnetName'))]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "7650487793556412399"
+ }
+ },
+ "parameters": {
+ "udrName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "nextHopAddress": {
+ "type": "string",
+ "defaultValue": ""
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Network/routeTables",
+ "apiVersion": "2020-06-01",
+ "name": "udrName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "routes": "[if(equals(parameters('addressPrefix'), ''), null(), createArray(createObject('name', 'Nested-VMs', 'properties', createObject('addressPrefix', parameters('addressPrefix'), 'nextHopType', 'VirtualAppliance', 'nextHopIpAddress', parameters('nextHopAddress')))))]"
+ }
+ }
+ ],
+ "outputs": {
+ "udrId": {
+ "type": "string",
+ "value": "Microsoft.Network/routeTables/udrName"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "udrUpdate",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "udrName": {
+ "value": "[format('{0}UDR', parameters('azureVMsSubnetName'))]"
+ },
+ "addressPrefix": {
+ "value": "10.0.2.0/24"
+ },
+ "nextHopAddress": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'createNic2'), '2019-10-01').outputs.assignedIp.value]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "7650487793556412399"
+ }
+ },
+ "parameters": {
+ "udrName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "nextHopAddress": {
+ "type": "string",
+ "defaultValue": ""
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Network/routeTables",
+ "apiVersion": "2020-06-01",
+ "name": "udrName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "routes": "[if(equals(parameters('addressPrefix'), ''), null(), createArray(createObject('name', 'Nested-VMs', 'properties', createObject('addressPrefix', parameters('addressPrefix'), 'nextHopType', 'VirtualAppliance', 'nextHopIpAddress', parameters('nextHopAddress')))))]"
+ }
+ }
+ ],
+ "outputs": {
+ "udrId": {
+ "type": "string",
+ "value": "Microsoft.Network/routeTables/udrName"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/createNic2"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT739 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT739
new file mode 100644
index 0000000..bb5abd2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT739
@@ -0,0 +1,306 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/nfs-ha-cluster-ubuntu/nested/nfs-ha-vm.json",
+ "/demos/nfs-ha-cluster-ubuntu/nested/nfs-ha.param.json"
+ ],
+ "timestamp": 1642962900518,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/nfs-ha-cluster-ubuntu/nested/nfs-ha-vm.json",
+ "/demos/nfs-ha-cluster-ubuntu/nested/nfs-ha.param.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT739",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT739",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "vmIndex": {
+ "metadata": {
+ "description": "Index of the VM"
+ },
+ "type": "int"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure location where this template is to be deployed"
+ }
+ },
+ "subnetId": {
+ "metadata": {
+ "description": "Azure resource ID of the subnet where this NFS-HA cluster is to be deployed"
+ },
+ "type": "string"
+ },
+ "ipAddrs": {
+ "metadata": {
+ "description": "Statically assigned private IP addresses that should be assigned to the two VMs' NICs to be deployed. Must belong to the IP range of the specified subnet"
+ },
+ "type": "array"
+ },
+ "nfsClientsIPRange": {
+ "metadata": {
+ "description": "IP range of the allowed NFS clients. E.g., 10.0.0.0/24"
+ },
+ "type": "string",
+ "value": "10.0.0.0/24"
+ },
+ "enableAccelNwSwitch": {
+ "metadata": {
+ "description": "Switch to enable Azure Accelerated Networking (Note: this feature is NOT available for D1-level VM SKU)"
+ },
+ "type": "bool",
+ "defaultValue": false
+ },
+ "availSetId": {
+ "metadata": {
+ "description": "Azure resource ID of the availability set where this VM is to be deployed"
+ },
+ "type": "string"
+ },
+ "vmSku": {
+ "metadata": {
+ "description": "Azure VM SKU for the NFS HA VMs"
+ },
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3"
+ },
+ "adminUserName": {
+ "metadata": {
+ "description": "VM admin user name"
+ },
+ "type": "string",
+ "defaultValue": "azureadmin"
+ },
+ "sshPublicKey": {
+ "metadata": {
+ "description": "SSH public key for the admin user"
+ },
+ "type": "string",
+ "value": ""
+ },
+ "osType": {
+ "metadata": {
+ "description": "OS type (offer/publisher/sku/version) info"
+ },
+ "type": "object"
+ },
+ "osDiskStorageType": {
+ "defaultValue": "Premium_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "metadata": {
+ "description": "Azure storage type for all VMs' OS disks. With htmlLocalCopySwith true, Premium_LRS (SSD) is strongly recommended, as PHP files will be served from OS disks."
+ },
+ "type": "string"
+ },
+ "dataDiskCountPerVM": {
+ "metadata": {
+ "description": "Number of data disks per VM. 2 or more disks will be configured as RAID0"
+ },
+ "defaultValue": 1,
+ "minValue": 1,
+ "maxValue": 8,
+ "type": "int"
+ },
+ "dataDiskSizeInGB": {
+ "defaultValue": 32,
+ "metadata": {
+ "description": "Size of each disk in an NFS server"
+ },
+ "type": "int"
+ },
+ "resourcesUniqueString": {
+ "metadata": {
+ "description": "Unique string of fixed length (e.g., 6) identifying related resources"
+ },
+ "type": "string",
+ "defaultValue": "[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]"
+ },
+ "lbBeId": {
+ "metadata": {
+ "description": "Azure resource ID of the load balancer backend pool to which this VM's NIC should be added"
+ },
+ "type": "string"
+ },
+ "node0IPAddr": {
+ "value": "10.0.0.111"
+ },
+ "node1IPAddr": {
+ "value": "10.0.0.122"
+ },
+ "lbFrontEndIpAddr": {
+ "value": "10.0.0.100"
+ }
+ },
+ "variables": {
+ "nicName": "nfs-ha-nicvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]",
+ "ipCfgName": "nfs-ha-ipcfgvmIndex",
+ "vmResourceName": "nfs-ha-vmvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]",
+ "vmName": "hanodevmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]",
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/setup_nfs_ha.sh', parameters('_artifactsLocationSasToken')))]",
+ "commonFunctionsScriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/helper_functions.sh', parameters('_artifactsLocationSasToken')))]",
+ "cmdExec": "[concat('bash -x setup_nfs_ha.sh hanode0-', parameters('resourcesUniqueString'), ' ', parameters('ipAddrs')[0], ' hanode1-', parameters('resourcesUniqueString'), ' ', parameters('ipAddrs')[1], ' ', parameters('nfsClientsIPRange'))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "location": "location",
+ "name": "nfs-ha-nicvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipcfgName",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "ipAddrs)[parameters(vmIndex",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "lbBeId"
+ }
+ ]
+ }
+ }
+ ],
+ "enableAcceleratedNetworking": false
+ },
+ "tags": {
+ "displayName": "NIC for NFS-HA nodevmIndex VM"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2019-12-01",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nfs-ha-nicvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]"
+ ],
+ "location": "location",
+ "name": "nfs-ha-vmvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]",
+ "properties": {
+ "availabilitySet": {
+ "id": "availSetId"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nfs-ha-nicvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]"
+ }
+ ]
+ },
+ "osProfile": {
+ "adminUsername": "azureadmin",
+ "computerName": "hanodevmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/azureadmin/.ssh/authorized_keys",
+ "keyData": ""
+ }
+ ]
+ }
+ }
+ },
+ "storageProfile": {
+ "imageReference": "osType",
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ },
+ "name": "nfs-ha-vmvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]_osDisk"
+ },
+ "copy": [
+ {
+ "name": "dataDisks",
+ "count": 1,
+ "input": {
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ },
+ "diskSizeGB": 32,
+ "lun": "[copyIndex('dataDisks')]",
+ "createOption": "Empty"
+ }
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "extensions",
+ "apiVersion": "2019-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//nfs-ha-vmvmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]"
+ ],
+ "location": "location",
+ "name": "setup_nfs_ha",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/setup_nfs_ha.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/helper_functions.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "[concat('bash -x setup_nfs_ha.sh hanode0-', parameters('resourcesUniqueString'), ' ', parameters('ipAddrs')[0], ' hanode1-', parameters('resourcesUniqueString'), ' ', parameters('ipAddrs')[1], ' ', parameters('nfsClientsIPRange'))]"
+ },
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0"
+ },
+ "tags": {
+ "displayName": "NFS-HA VM setup CustomScript extension"
+ }
+ }
+ ],
+ "tags": {
+ "displayName": "NFS-HA Virtual Machine hanodevmIndex-[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT74 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT74
new file mode 100644
index 0000000..152333e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT74
@@ -0,0 +1,315 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/ckan/docker-ckan/azuredeploy.json",
+ "/application-workloads/ckan/docker-ckan/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885408,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/ckan/docker-ckan/azuredeploy.json",
+ "/application-workloads/ckan/docker-ckan/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT74",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT74",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Storage Account where the Virtual Machine's disks will be placed."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "dnsNameForPublicIP": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the Virtual Machine."
+ },
+ "value": "Standard_D2_v3"
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "ubuntuOSVersion": "16.04-LTS",
+ "nsgName": "myNSG",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyDockerCkanVM",
+ "virtualNetworkName": "MyVNET",
+ "nsgID": "Microsoft.Network/networkSecurityGroups/myNSG",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-13"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/myNSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/myNSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP",
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-05-01-preview",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "myNSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "http",
+ "properties": {
+ "description": "Allow HTTP",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "ssh",
+ "properties": {
+ "description": "Allow SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyDockerCkanVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE",
+ "Microsoft.Network/networkInterfaces//myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "MyDockerCkanVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "MyDockerCkanVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "MyDockerCkanVM/ckanDocker",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//MyDockerCkanVM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "DockerExtension",
+ "typeHandlerVersion": "1.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "compose": {
+ "db": {
+ "image": "ckan/postgresql"
+ },
+ "solr": {
+ "image": "milafrerichs/ckan_solr"
+ },
+ "ckan": {
+ "image": "ckan/ckan",
+ "ports": [
+ "80:80"
+ ],
+ "links": [
+ "db:db",
+ "solr:solr"
+ ]
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT741 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT741
new file mode 100644
index 0000000..fa9c938
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT741
@@ -0,0 +1,89 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/nfs-ha-cluster-ubuntu/prereqs/prereq.azuredeploy.json",
+ "/demos/nfs-ha-cluster-ubuntu/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900562,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/nfs-ha-cluster-ubuntu/prereqs/prereq.azuredeploy.json",
+ "/demos/nfs-ha-cluster-ubuntu/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT741",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT741",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure location where this template is to be deployed"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-05-01",
+ "name": "nfs-ha-vnet-default",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/24"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "nfs-ha-subnet-default",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "subnetId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'nfs-ha-vnet-default', 'nfs-ha-subnet-default')]"
+ },
+ "node0IPAddr": {
+ "type": "string",
+ "value": "10.0.0.111"
+ },
+ "node1IPAddr": {
+ "type": "string",
+ "value": "10.0.0.122"
+ },
+ "nfsClientsIPRange": {
+ "type": "string",
+ "value": "10.0.0.0/24"
+ },
+ "lbFrontEndIpAddr": {
+ "type": "string",
+ "value": "10.0.0.100"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT742 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT742
new file mode 100644
index 0000000..ab09a60
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT742
@@ -0,0 +1,251 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/nfs-ha-cluster-ubuntu/azuredeploy.json",
+ "/demos/nfs-ha-cluster-ubuntu/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900579,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/nfs-ha-cluster-ubuntu/azuredeploy.json",
+ "/demos/nfs-ha-cluster-ubuntu/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT742",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT742",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure location where this template is to be deployed"
+ }
+ },
+ "subnetId": {
+ "metadata": {
+ "description": "Azure resource ID of the subnet where this NFS-HA cluster is to be deployed"
+ },
+ "type": "string",
+ "value": "GET-PREREQ-subnetId"
+ },
+ "node0IPAddr": {
+ "metadata": {
+ "description": "IP address of node 0 (statically assigned). E.g., 10.0.0.11. Must belong to the IP range of the specified subnet"
+ },
+ "type": "string",
+ "value": "GET-PREREQ-node0IPAddr"
+ },
+ "node1IPAddr": {
+ "metadata": {
+ "description": "IP address of node 1 (statically assigned). E.g., 10.0.0.22. Must belong to the IP range of the specified subnet"
+ },
+ "type": "string",
+ "value": "GET-PREREQ-node1IPAddr"
+ },
+ "nfsClientsIPRange": {
+ "metadata": {
+ "description": "IP range of the allowed NFS clients. E.g., 10.0.0.0/24"
+ },
+ "type": "string",
+ "value": "GET-PREREQ-nfsClientsIPRange"
+ },
+ "lbFrontEndIpAddr": {
+ "metadata": {
+ "description": "IP address of the load balancer front-end (statically assigned). E.g., 10.0.0.100. Must belong to the IP range of the specified subnet"
+ },
+ "type": "string",
+ "value": "GET-PREREQ-lbFrontEndIpAddr"
+ },
+ "enableAccelNwSwitch": {
+ "metadata": {
+ "description": "Switch to enable Azure Accelerated Networking (Note: this feature is NOT available for D1-level VM SKU)"
+ },
+ "type": "bool",
+ "defaultValue": false
+ },
+ "vmSku": {
+ "metadata": {
+ "description": "Azure VM SKU for the NFS HA VMs"
+ },
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3"
+ },
+ "adminUserName": {
+ "metadata": {
+ "description": "VM admin user name"
+ },
+ "type": "string",
+ "defaultValue": "azureadmin"
+ },
+ "sshPublicKey": {
+ "metadata": {
+ "description": "SSH public key for the admin user"
+ },
+ "type": "string",
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "osType": {
+ "metadata": {
+ "description": "OS type (offer/publisher/sku/version) info"
+ },
+ "type": "object",
+ "defaultValue": {
+ "offer": "UbuntuServer",
+ "publisher": "Canonical",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ },
+ "osDiskStorageType": {
+ "defaultValue": "Premium_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "Standard_LRS"
+ ],
+ "metadata": {
+ "description": "Azure storage type for all VMs' OS disks. With htmlLocalCopySwith true, Premium_LRS (SSD) is strongly recommended, as PHP files will be served from OS disks."
+ },
+ "type": "string"
+ },
+ "dataDiskCountPerVM": {
+ "metadata": {
+ "description": "Number of data disks per VM. 2 or more disks will be configured as RAID0"
+ },
+ "defaultValue": 1,
+ "minValue": 1,
+ "maxValue": 8,
+ "type": "int"
+ },
+ "dataDiskSizeInGB": {
+ "defaultValue": 32,
+ "metadata": {
+ "description": "Size per disk in an NFS server"
+ },
+ "type": "int"
+ },
+ "resourcesUniqueString": {
+ "metadata": {
+ "description": "Unique string of fixed length (e.g., 6) identifying related resources"
+ },
+ "type": "string",
+ "defaultValue": "[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "name": "pid-38a42e4d-89db-4159-9b75-9113b6eae9b6",
+ "properties": {
+ "mode": "Incremental",
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "resources": [],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "name": "nfs-ha-deployment",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "subnetId": {
+ "value": "GET-PREREQ-subnetId"
+ },
+ "node0IPAddr": {
+ "value": "GET-PREREQ-node0IPAddr"
+ },
+ "node1IPAddr": {
+ "value": "GET-PREREQ-node1IPAddr"
+ },
+ "nfsClientsIPRange": {
+ "value": "GET-PREREQ-nfsClientsIPRange"
+ },
+ "lbFrontEndIpAddr": {
+ "value": "GET-PREREQ-lbFrontEndIpAddr"
+ },
+ "enableAccelNwSwitch": {
+ "value": false
+ },
+ "vmSku": {
+ "value": "Standard_D2s_v3"
+ },
+ "adminUserName": {
+ "value": "azureadmin"
+ },
+ "sshPublicKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "osType": {
+ "value": {
+ "offer": "UbuntuServer",
+ "publisher": "Canonical",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ },
+ "osDiskStorageType": {
+ "value": "Premium_LRS"
+ },
+ "dataDiskCountPerVM": {
+ "value": 1
+ },
+ "dataDiskSizeInGB": {
+ "value": 32
+ },
+ "resourcesUniqueString": {
+ "value": "[substring(uniqueString(resourceGroup().id, deployment().name), 3, 6)]"
+ }
+ },
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/nfs-ha.json', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT743 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT743
new file mode 100644
index 0000000..2d22a22
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT743
@@ -0,0 +1,751 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-active-directory-security-audit-solution/azuredeploy.json",
+ "/demos/oms-active-directory-security-audit-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900595,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-active-directory-security-audit-solution/azuredeploy.json",
+ "/demos/oms-active-directory-security-audit-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT743",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT743",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources"
+ },
+ "defaultValue": "[resourceGroup().location]"
+ },
+ "pricingTier": {
+ "type": "string",
+ "defaultValue": "Standalone",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode"
+ ],
+ "metadata": {
+ "description": "Service Tier: Free, Standalone, or PerNode"
+ }
+ }
+ },
+ "variables": {
+ "ViewDescription": "Active Directory Security Audit monitoring solution",
+ "ViewName": "Users And Groups Monitoring",
+ "ViewName2": "User Account Security Monitoring"
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "Standalone"
+ }
+ },
+ "resources": [
+ {
+ "name": "AD Security Audit Solution",
+ "location": "[resourceGroup().location]",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE/Users And Groups Monitoring",
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE/User Account Security Monitoring"
+ ]
+ },
+ "plan": {
+ "name": "AD Security Audit Solution",
+ "Version": "1.1",
+ "product": "MillenniumSolution",
+ "publisher": "asithad",
+ "promotionCode": ""
+ }
+ },
+ {
+ "apiVersion": "2017-03-03-preview",
+ "name": "GEN-UNIQUE/Users And Groups Monitoring",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "location": "[resourceGroup().location]",
+ "id": "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE/Users And Groups Monitoring",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE"
+ ],
+ "properties": {
+ "Id": "Users And Groups Monitoring",
+ "Name": "Users And Groups Monitoring",
+ "DisplayName": "Users And Groups Monitoring",
+ "Description": "Active Directory Security Audit monitoring solution",
+ "Author": "asithad",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "NumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Created User Accounts",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "User Account Created",
+ "Query": "SecurityEvent | where (EventID == 624 or EventID == 4720) | summarize count() by TargetUserName | count"
+ },
+ "List": {
+ "Query": "SecurityEvent | where (EventID == 624 or EventID == 4720) | extend CreatedBy = SubjectUserName | extend AccountName = SamAccountName | extend Time =TimeGenerated +330m | project AccountName, CreatedBy,Time",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Account Name",
+ "Value": "Date and Time"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "NumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Deleted User Accounts",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "SecurityEvent | where (EventID == 630 or EventID == 4726) | summarize count() by TargetUserName | count",
+ "Legend": "User Account Deleted "
+ },
+ "List": {
+ "Query": "SecurityEvent | where (EventID == 630 or EventID == 4726) | extend DeletedBy = SubjectUserName | extend AccountName = TargetUserName | extend Time =TimeGenerated +330m | project AccountName, DeletedBy,Time",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Account Name",
+ "Value": "Date and Time"
+ },
+ "Color": "#ba141a",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "TwoNumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Global Group Membership Changes ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Users Added - Domain/Enterprise Admin group",
+ "Query": "search in (SecurityEvent) EventID == 4728 or EventID == 4732 or EventID == 4756 or EventID == 632 or EventID == 636 or EventID == 660 | where TargetUserName == \"Domain Admins\" or TargetUserName ==\"Enterprise Admins\" | summarize AggregatedValue = count() by MemberName | count"
+ },
+ "SecondTile": {
+ "Legend": "Users Removed - Domain/Enterprise Admin group",
+ "Query": "search in (SecurityEvent) EventID == 4729 or EventID == 4733 or EventID == 4757 or EventID == 633 or EventID == 637 or EventID == 661 | where TargetUserName == \"Domain Admins\" or TargetUserName ==\"Enterprise Admins\" | summarize AggregatedValue = count() by MemberName | count"
+ },
+ "List": {
+ "Query": "search in (SecurityEvent) EventID == 4728 or EventID == 4732 or EventID == 4756 or EventID == 632 or EventID == 636 or EventID == 660 or EventID == 4729 or EventID == 4733 or EventID == 4757 or EventID == 633 or EventID == 637 or EventID == 661 | extend Action = iff(Activity ==\"4728 - A member was added to a security-enabled global group.\" ,\"Added\",\"Removed\" ) | extend GroupName = TargetUserName | extend Time =TimeGenerated +330m | project Action , GroupName, Time",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Action",
+ "Value": "Date and Time"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "NotableQueriesBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "List of queries",
+ "newGroup": false,
+ "preselectedFilters": "Type, Computer",
+ "renderMode": "grid"
+ },
+ "queries": [
+ {
+ "query": "Type=SecurityEvent (EventID=624 OR EventID=4720) | EXTEND SubjectAccount AS CreatedBy | Select TimeGenerated, TargetAccount, CreatedBy, Computer",
+ "displayName": "Accounts Created"
+ },
+ {
+ "query": "SecurityEvent | where (EventID == 630 or EventID == 4726) | extend DeletedBy = SubjectAccount | project TimeGenerated, TargetAccount, DeletedBy, Computer",
+ "displayName": "Accounts Deleted"
+ },
+ {
+ "query": "search in (SecurityEvent) EventID == 4728 or EventID == 4732 or EventID == 4756 or EventID == 632 or EventID == 636 or EventID == 660 or EventID == 4729 or EventID == 4733 or EventID == 4757 or EventID == 633 or EventID == 637 or EventID == 661 | extend Action = iff(Activity ==\"4728 - A member was added to a security-enabled global group.\" ,\"Added\",\"Removed\" ) | project Action , MemberName, TargetUserName, TimeGenerated | sort by TimeGenerated desc",
+ "displayName": "Group Membership Changes"
+ },
+ {
+ "query": "SecurityEvent | where (EventID == 631 or EventID == 4727) | extend CreatedBy = SubjectUserName | extend GroupName = TargetUserName | project CreatedBy, GroupName, Activity, TimeGenerated ",
+ "displayName": "Groups Created"
+ },
+ {
+ "query": "SecurityEvent | where (EventID == 634 or EventID == 4730) | extend DeletedBy = SubjectUserName | extend GroupName = TargetUserName | project DeletedBy, GroupName, Activity, TimeGenerated ",
+ "displayName": "Groups Deleted"
+ }
+ ]
+ }
+ },
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4RD6RXhpZgAATU0AKgAAAAgABAE7AAIAAAAQAAAISodpAAQAAAABAAAIWpydAAEAAAAgAAAQ0uocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFzaXRoYSBEZSBTaWx2YQAABZADAAIAAAAUAAAQqJAEAAIAAAAUAAAQvJKRAAIAAAADMjEAAJKSAAIAAAADMjEAAOocAAcAAAgMAAAInAAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIwMTg6MDg6MzEgMTU6MTc6MjcAMjAxODowODozMSAxNToxNzoyNwAAAEEAcwBpAHQAaABhACAARABlACAAUwBpAGwAdgBhAAAA/+ELImh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTgtMDgtMzFUMTU6MTc6MjcuMjEzPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPkFzaXRoYSBEZSBTaWx2YTwvcmRmOmxpPjwvcmRmOlNlcT4NCgkJCTwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDAAcFBQYFBAcGBQYIBwcIChELCgkJChUPEAwRGBUaGRgVGBcbHichGx0lHRcYIi4iJSgpKywrGiAvMy8qMicqKyr/2wBDAQcICAoJChQLCxQqHBgcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKir/wAARCACtANUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDkqKKK/Rj82CiiigAooooAKKKKACiiigAooooAKKXFFACUUUUAFFFFABRRRQAUUUtACUUUUDCiiigQUUUUAFFFFABRRRQAUUUUAFFFFABT443lkWOJGd2OFVRkk1d0XRb7xBqkdhpkJlmk/JR3YnsK9+8IeAtM8KW6uqrc37L+8uXXv6L6CuDF46nhVrq+x6GDwNTFO60j3PMdA+EWt6oizaky6bC3IEgzIR/u9vxrutP+Dvhq1UfbDc3r9y8hQH8BXe0V83VzLE1H8Vl5H01HLcNSXw3fmcuvw28JKuBo0R9yxJqnefCfwndIfLs5bZuzRTNx+BOK7SiudYqundTf3nQ8LQas4L7jx3W/grcxK0mg363AHSG4G1j9D0rzbU9Jv9GvDa6nayW0w/hdcZ9x619V1n61oWneILBrTVbZZoz0P8SH1B7V6WHzarB2q6r8TzcTlFKavS0f4HyxRXV+NvAt54RvA4LXGnytiK4x0/2W9D/OuUr6WnUhVgpwd0z5erSnSm4TVmFFFFaGYUUUtABSU5tu47M7c8Z64ptIYUUUUxBRRRQAUUUUAFFFFABRRRQAU+KJ55kiiUvI7BVUDkk0yvQ/g/4fXU/Ekmp3CbodPUFQehkPT8v61hXrKjSdR9DfD0XXqqmup6Z4E8IQ+E9DVHVW1CcBrmT3/uD2FdRRRXw1SpKrNznuz7ynTjSgoQ2QUUUVmaBRRTJ5DFbSygZMaMwHrgZpiH0V47D8a9Rluo4jpFqA8gXPmnjnHpXsZGDXRXwtXD29orXOfD4qliL+zd7FXUtOtdX02ew1CIS2867XU/zHuK+a/FXhy48L+IJ9OuPmVTuhk7SIehr6drgPi74fXU/Cw1KJM3OntuJHUxk4I/kfwrtyzFOjV5H8MvzOLNMKq1FzXxR/I8Hooor64+OCiiigAooooAKKKKACiiigAooooAKKKKACinxRSTyrHCjSOxwqqMk11T/DvV7PSYtS1ZVtIpJ44REeZPnbGcdqynVhTspO1zWnRqVE3FXscnXv3wi08WfgOKfGHvJnlJ9gdo/9Bqu3wm8NaZpN1JJHcXk0cDsHlkIG4L1wuK3vh+Avw/0cD/n3z/48a+fzDGwxFC1Puv1PosvwNTDV71Oz/Q6KmyNsidhztUn8hTqZN/x7y/8AXNv5V4J77PHl+Nepm4Ef9k2mC+377euK9jjbfGjH+JQfzFfKEf8Ax/L/ANdh/wChV9UmQw6d5oGSkG4A98LmvazTD0qPJ7NWvf8AQ8XK8TVrc/tHe1v1J6hvP+Qfc/8AXF/5GvIU+NWqteLCdKssGUJnLdN2PWvXblt+lzt03W7H81rz62Fq4dr2i3PQo4qliFL2b2Ple0/5CUH/AF2X/wBCr6wb7xr5PtP+QlB/12X/ANCr6wb7xr1c63p/P9Dyck+Gp8v1EqC/tFv9NubRxlZ4XjIPuCKnpyjLDFeAm07o+gaurM+SriIwXMsJ6xuyH8Dio69uvPCHgK8v5rN/tCXk0hzdrK2A5PT+719vxryzxZ4Yu/CeuyafdnzFxvhmAwJUPQ+x7Eeor7DB5nh8Y3Gk9UfG43LMTg0p1VozEooor0zywooooAKKKKACiiigAooooAK0NF0W98QarFp+mxeZNIfwQd2J7AVRjjeWRY41Lu5CqoGSSe1dnoviTUvhpqN/p7afaz3TMokZ2JK4HQEdqwrTnGLVPWXRG9CEJSTqaR6s6O0+Hv8AYHjfSLG01m6huLm1lkkuIVUFCuOFyOhzV34haBf6R4Se9fxJqV95U8ZWKfbtzng8DqMVkaV4313xZ45sLnT9OsheW1vKiRvIQjKcZJPrxWt4+k8XX3hf7Lq+n6bBby3Eab4JizBicD8Oa8R+3VemqrV9L7X3Z7q9g6FR0ou3Te2yPPJfHfieWJ45NaumR1KsC3UEV7t4C48BaP8A9e/9TXkVx8I/EtvbSzSfZdsaF2xKOgGa9c8BHPgHRyP+ff8AqanMp0JUV7G2/T0LyyFeNZ+2vt19UdDTJv8Aj3l/65t/Kn02VS0MijqUIH5V4C3Pfex8ox/8fy/9dh/6FX1NP/yB5P8Ar2P/AKBXgqfDDxaLtXOl/KJA2fNXpn6177NE7aa8SjLmAoB77cV7ua1adR0+SSe/6Hg5TRqU1U54tbfqfLMP/IWj/wCvgf8AodfUk3/IIl/69j/6BXg0fwy8WrqCSnS/kEwYnzV6bs+te+Sxs2nSRAfOYCgHvtxRmtWnUcOSSe/6DyqlUpqpzxaufK1p/wAhKD/rsv8A6FX1g33jXz3b/DHxbHexSPpeFWQMT5q9M/WvoQ9TU5vVp1HDkae+3yHk9KpTU+eLW2/zErG8V6v/AGTo5jibFzc5RMdVHc/59a2tyojSSEKiAsxPQAV5Xr2qtrGrSXJyIx8sSnso6f4/jXyWYYn2NKy3Z9dl+H9tVu9kZtbmu6Z/wnfgMqg36xpQ3Rf3pVxyPxA/NR61h1oaHqr6PqsVyuSn3ZFH8Snr/j+FeLluNlgsRGrE9nMsFHG4eVKR490pK7z4qeF00jXE1bT1B07VP3qlfupIeWH0P3h9T6VwlftNCtGvTVSGzPxWvRlQqOnPdCUUUtamIlFFFMQUUUUAFFFFAHV/D77PbeJI9SvrG8vIbQblW1tzLiTtnHTHWmeKo7zxF4w1K903Tb50aQbkNu25OOjDHFei/CW60rSfBzSXWpWdvcXU7OySzqrADgcE+1aPhfWtLh8WeKpJdTs40luozG7TqA429Qc814VTFyhXqTjC7irfij6CnhIzw9OnKdlJ3/BnmngSW58L+MoLnU9MvxmFwsSWzF246hcciu28a+MrbUtChgj0vVYSt5DJuntGRTtbOMnv6CtbUta0yT4naHcJqVo8MdnOryLOpVScYBOeKX4g6zptz4cgSDUrSVxfW7FUmUkAPyeD0rmnV9tXp1JQ1f8Am/I6IUvY4epTjPRX/JeY7UfH9pNpl3GNG1pS8DrlrFgBlep4rU8A8eANH/69/wCpqxqviLRn0i+VNYsGLW7gAXKEk7T71X8A/wDIgaN/17j+Zrz529g7RtqvyZ6ML+3V5X0f5o6GiiiuE7gooooAKKKKACiio7q6isLKW7uDiOJcn39v6UpNRV2OKcnZHN+ONY+zWa6ZA37yYbpSOy+n4n9B71wVWL+9l1G/mu5zl5WyR6DsPwHFek/8IdoX/Pj/AORn/wDiq+YlTqZhVlOD0Xc+mU6eX0owktX2PLqK9R/4Q7Qv+fH/AMjP/wDFUf8ACHaF/wA+P/kZ/wD4qq/sqv3X4/5C/tWh2f4f5nJabBB4s8LXfhjUGAfaZLSRv4GHI/I/oSK8QvrOfTr6ezvIzHPA5jkQ9iDivW7iQ6T4jnex/d/ZrlxGMk4AYjHvxxVP4q6DFqenW3jDS0+WRVjvFH8J6Kx+h+U/8Br6vhjMeVvCVH6f1/XQ+S4ny1SSxdNev9fj955TRS0lffnwAUUUUCFopCrN90geuTRQOwUtJRQI988BeF9EvfAum3N1pdvPNJGS8jx5JOai8NeGdGufFXieGfS7eSO3uY1iVo8hAV6CvHbTxNrVjapbWeqXUMKfdjR8AV3nw00m58UR6rd3WualazCVN7W8gHmcdWyDk18/iMNUpRqVJVNH66an0WHxVKtKnThT1XproVvjFpFhpOoaWmm2cVqskTlxGuNxyK4LSo0k1myR0DK1xGrKR1BYcV6trngO3vPG+k6Tf6vqV3FcW0shkmkUsm3HA+XpVbxR8MdK8O6XBfWN7emb7XDGC7L8u5sZGB1rfD4ulClClKTba3+bMMTg6s6s6sY2Se3yR3uqeD/D8ek3jpo1qrLA7KRF0IWl8AgnwBo/BP8Ao47e5rM1HwM8OmXcn/CT62+yB22tMuGwvQ/L0rN8IeDmv/CGm3Q8RavbebCG8qGVQicngDbXjNRlQfNUvquj7M9pOca65adtH1XdHo+D6H8qMH0P5V5voPhy61XUNagn8S6wi6feeRGUmXLLtByfl680258PXcPjmz0VfEusG3ns3uGczLuDA4wPlxisvq0OZx59lfZ9rmn1mfKpcm7tuu9j0rB9D+VGD6H8q818UeHrvQ7WxltfEusObi+itm8yZeFdsEjC9a0tW8GzWGj3t3F4o1tnt7d5VDTLglVJGfl9qX1eFk+ffyZX1ipdrk280dxg+h/KkciNdzkKo7scVwOh+FJtS8O2eo3XifWkeeASuEmXA9cfLXjeq6vqE99cRPqd5PCkrKnmTscqCQM9q6aGXqvJxjPbfQ5sRmLoQUpQ321PpD/hIdKbVItOhvI57yU/LDCd5x1JJHAAFc3451jzbhdLt2/dw/NKR3bsPw/r7Vh/DvSE8J+EJ/Et9GPt1+u22VhyEPT/AL6I3fQCs6SR5pXklYs7sWZj1JPevmM9q06Evq1J37s+myKlUrx+s1Vbshte2V4nXUf8LA1X/n3s/wDvhv8A4qvJy/E08Pzc/W36nr5hhqlfl5Ol/wBD0SiuVtvFF7N4QvNVaKATwTCNVCttIynUZz/Ee9Yv/CwNV/597P8A74b/AOKr154+hC1+queRDAVp3t0djE1r/kP6h/19Sf8AoRrW8KXsEvn6JqSiSyv1KbW6biMY/EfrisG6uHu7ya5kCh5pGkYL0BJzxUSsVYMpIIOQR2r52nXlSr+1h3PoalCNWh7KfY4XxT4fn8MeIrnTLjLCNt0UhH+sjP3W/wA9wax69r8aaUPG/gZNVtkDarpYPmKo5kTqw/L5h+I714pX7NluNjjMPGot+p+MZlgpYLESpvboFFFFeieabvhu0t7o3P2hFbaE257Z3f4UVjRTyw58qRkz12nrRXNOlOUrqR1U60IxScSOiiiuk5TY8NeHLjxRqhsLOeGGfYXUSnG7HUCvQ/Ael+KNBu9a03SP7Mka3mRZ2uN3XHG3BHFeYaTqdxo2rW2oWbbZreQOvv7H2Ner+FPG8Ta1r2oWuj6ldx3s6OBbwl/LwvQ4rysf7blaSTjb8bo9fL3R5ottqV/wsyfUH8X/APCwdIMyaT9u+yzeSF3+Xt43buc59KPGr+LzocI1VNJEP2yHaYN+7fu+XqemetJqHi4y/EDSL3+wtWUw2syeQ1uRI+ccqMcgd6b438Yi98PxpJomq2iR3cMrS3FuUXCtnGcda82EanPT9xf035npTlT5Knvv+kvI3dRk8dnTLvz49D8vyX37d+cbecfNWb4PfxmPB+mDTU0c2nkjyjNv34yeuGqK/wDjFoNzp9zClteBpYmQZTuRipPCHjE2HhDTbX+wNYuPJhC+bDbFkbk8g45rN0q8aL5qaWq6eT8zVVKMqy5ajej6+a8iLwy/jAap4g+wppJlN/8A6T5u/AfYPu4PTGOtY3i7xL4k8MeMLDUdTg057r7I8cawhtm0nknnOa1/DXi82eqeIJBoWrTfab/zCsVuWMfyAbW44PtXMfEe7vPFniCxWx0bUYpo7Zh5M0BDsM9QMdK6qMG8TapBcttfu9TlrTUcNenN819Pv9CG9+I+s+KrjTtPktbKJhexSRsoYDeGGM89M16FrUnjk6DqH2qPRRAbWTzdm/cF2nOPm64rx2y0jVtF1fT73UNKvYoo7qM/NCQWO4HaM9zXsGteN2udC1CH/hHdaj822kTe9qQq5UjJOOlPF0owlBUIpr+vMnB1ZTjN15NP+vIwZ9c8UaF8Nbe4f+y1sXtlhiPzeaQwPvjOM1w3gLws3irxRDayBjaQ/vbpv9gHpn1J4/M9qTxJ4pbXNL0fS7ZXW2sLcIVPV5O5/LGPxr0/RtNHgHwCkLDZq+pfPMe6cdP+Ag4+pNLFYhZdhJ1ZK0pX/r+urHhcO8xxcKUW3GKX9f10RH4t1Zb/AFIW1rgWloPLjVeAT3P6YH0rBorb8O+Hf7f+0/6V9n8jb/yz3bt2fcelflD9piq2mrZ+rr2eFo66JGJRXbf8K6/6in/kv/8AZUf8K6/6in/kv/8AZVt/Z+J/l/Ff5mP9oYb+b8H/AJFGw/5Jpqf/AF9L/OOuXr0qDwp5Hhm50j7bu+0SiTzfKxt5XjGefu+vesv/AIV1/wBRT/yX/wDsq6a+CxE1C0dlbdd2c9HG4eLneW7vs+yOJortv+Fdf9RT/wAl/wD7KsTxF4d/sD7N/pX2jz93/LPbt249z61x1MHXpRc5xsl5o66eMoVZKEJa+jGeGNY/sjVlaQ/6PN8ko9B2P4f41w/xL8Kf8Iz4laS0TGn32ZbfHRD/ABJ+BPHsRXQV032KPxz4HuNDuGX7faDfayN6j7v4fwn2Ir6DhzMvqtf2U37r/r+vmfP8SZZ9aoe1gveX9f18jweipJoZLa4kgnRo5Y2KOjDBUg4INR1+qH5QFFFFMAooooAK6vwJ41n8IaoSymWwuCBcRDr/ALw9xXKUVnUpxqwcJq6ZpSqzpTU4PVHu174q0O6+ImhahFqtt9lWymDyNIFCE4wGz0Psag+KHiPRtS8Dz29hq1ndTGVCI4plZiBnsDXjuk6m+kajHdxQwzlODHOm5WB6giu61Dxh4a1zQ4IF0iHTr8XULPtjGwoG+bDDtj1rxpYFUqtOUU2o+ne+p7cMf7alUjJpN+va2h5wSOeR+dfQfgrxToNn4L0u3utasYJo4QHjedQynJ6jNaFzpvhq80W8m06102cC3dlaEK2PlPpVLwNoGlXPgfSZrjTLaWR4AWdogSTk965sXi6eJo+/Fqz/AEZ1YPB1MLV9ySd1+qKfhTxNodrq3iV7jWLKJJ9R3xM86gOuxRkc8imXniXRH+KGnXi6vZtbJp0iNMJ12qxPAJz1qbwvo2kNqvif7XYWnlwajtTzUACLsXgZ6CsLxHqfhLRvHtpcNDZz2cdi6yRWyBwZM8A44zWUYU51pKKbfL+hpKdSFGLk0lzef8xseOfEuiXtjpa2er2c7R6nBI4jnViqhhknB6Csn4j/ABMgNpLo/hy4EzTLtuLpDlQp6qp759a4TxX4tg179xp2kWunWituGxB5jfUj+VYFlZT6jfwWdnGZJ53EcaDuScV6eHy+nGMZVPs3dn+p5mIzGpKUo0/tWV1+h3Hwn8LLq2uNq9+oFhphD5bo0nUD6D7x/D1rpNf1ZtY1aS458ofJEp7KP8ev41r6lDB4Q8I2nhrT2BlZN1zIOrE/eP4n9BiuWr8+4hzJ4vEckX7q/r+v+AfoPDuWrCYfnkvef9f1/wAEK7b4df8AMR/7Zf8As9bukaRpsuiWMkmn2ru1vGWZoFJJKjknFaVtZWtnu+yW0MG/G7yowu7HTOPrWGEwEqVSNVy/po6MXj41acqSX9JnjVFev/2LpX/QMs//AAHX/CuD8cWtvaa3DHawRwIbdSVjQKCdzc4FcGIwEqFPncrndh8fGvPkSsc5RRWv4UgiuPE1pFcRJLG2/KOoYH5GPQ1w04c81BdXY7qk+SDm+iuZFdR4r/5AHh7/AK9f/ZY67f8AsXSv+gZZ/wDgOv8AhUsun2U8ccc9nBIkQxGrxKQg9ACOOg/Kvchls4wnHm3t+dzw55lCU4y5dr/lY8bq3pWoyaVqUN3DyUPzL/eXuK9I1fSNNi0S+kj0+1R1t5CrLAoIIU8g4ryyvMxGHnhJx113PTw+Ihi4S002GfFzw3H5sHinS13Wt6ALjaPuvjhvxHB9x715hXvXhqa21jS7vwzqvz290jeXnsepA9x94e4rxbXtGufD+uXWmXo/e277d2OHXqGHsRg1+pZDmKxmGUX8S/r+vkflmf5c8HiXJfDL+vx/zM6iiivoj5wKKKKACiiigAooooAkjnliz5UsiZ67WIzVyDXdVtYFhttRuYo1GAiSEAVn0VLjF7opTlHZk73lzIzl7iVjIdz5c/MfU1DSUU7JbCbb3CvWPhJ4fisbO58XaouI4lZLQEdezMP/AEEfjXm+haW+t69ZabG203Uyxlv7oJ5P4DJr2vxZdwWVvbeHtMXy7WzRQyj1A4H5cn3NfOcQZh9Uw3Kt5f1/Xlc+k4ey/wCt4nnltH+v687HPahey6jfzXc5+eVs49B2H4Cq9FFfkjbk7s/XElFWR6/ov/IA0/8A69Y//QRV2vNrXxxqVpZw20cFqUhjWNSyNkgDHPzVL/wsDVf+fez/AO+G/wDiq+khmWHUUnf7j5ueXV3JtW+89Erzv4gf8h+D/r1X/wBCaj/hYGq/8+9n/wB8N/8AFVjaxrFxrd4tzdJGjrGIwIwQMAk9yfWuXG42jWo8kNzqwWCq0avPPYoVt+Dv+Rss/wDgf/oDViVa03UJdL1CK8t1RpI84DgkcgjsR615NGShVjJ7Jo9atFzpSit2mexUV53/AMLA1X/n3s/++G/+Ko/4WBqv/PvZ/wDfDf8AxVfR/wBp4fu/uPnf7NxHl952+tf8gDUP+vWT/wBBNeQV0d1441K7s5raSC1CTRtGxVGyARjj5q5yvIx+Ip15RcOh62Aw9ShFqfUfBNJbXCTQsUkjYMrDsRWl8SNFj8VeE4PE2nR/6XZptuUUclO//fJ5+hNZVdH4M1L7PqhsJwHtrwbGVuRuxx+fT8a6Mnx0sHiU1sznzjARxmGcXujwqitjxZpiaN4u1PT4V2xQ3DCNSeiHlR+RFFfssJKcVJdT8YnFwk4voY9FLRVEiUUtFACUUtFACUUtFACUUtFAGj4e1c6D4isdTEfmC2mDsgONw7j8s17FLqHg/wAVP/aMHiCDTZpQDJFdMqEHHoxH6HFeGUV5eYZXQzBJVeh6uX5riMvb9l1Pb/7I8N/9DrpX/f2P/wCOUf2R4b/6HXSv+/sf/wAcrxCivG/1UwXn+P8Amez/AK2Y3sv6+R7f/ZHhv/oddK/7+x//AByj+yPDf/Q66V/39j/+OV4hRR/qpgvP8f8AMP8AWzG9l/XyPb/7I8N/9DrpX/f2P/45R/ZHhv8A6HXSv+/sf/xyvEKKP9VMF5/j/mH+tmN7L+vke3/2R4b/AOh10r/v7H/8co/sjw3/ANDrpX/f2P8A+OV4hRR/qpgvP8f8w/1sxvZf18j2/wDsjw3/ANDrpX/f2P8A+OUf2R4b/wCh10r/AL+x/wDxyvEKSj/VTBef4/5h/rZjey/r5HuH9keG/wDoddK/7+x//HKP7I8N/wDQ66V/39j/APjleH0Uf6qYLz/H/MP9bMd2X9fI9w/sjw3/ANDrpX/f2P8A+OVJbXfg/wAN3K3114ltr54gWjjtiHyfopPP5V4YKKunwtgoSUtdCKnFONnFx01NHxDqv9t+I7/UgrItzO0iq3VVzwD+GKKzqK+ojFRiorofLSk5Scnuz//Z",
+ "Label": "Security Audit",
+ "Link": {
+ "Label": "More info",
+ "Url": "https://asitha.info/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Active Directory Security Audit Solution",
+ "Content": "## Users and Groups Monitoring View\n1. Created user accounts\n2. Deleted user accounts\n3. Group membership changes - Domain Admin and Local Admin\n4. Related quries\n \n\nPost your feedback and Let us know how to improve this solution \n\n#### Solution by Asitha De Silva"
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "DoubleNumberBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "TileOne": {
+ "Legend": "Account Created",
+ "Query": "SecurityEvent | where (EventID == 624 or EventID == 4720) | summarize count() by SamAccountName | count"
+ },
+ "TileTwo": {
+ "Legend": "Account Deleted",
+ "Query": "SecurityEvent | where (EventID == 630 or EventID == 4726) | summarize count() by TargetUserName | count"
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search * | limit 1 | project TimeGenerated",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-03-03-preview",
+ "name": "GEN-UNIQUE/User Account Security Monitoring",
+ "type": "Microsoft.OperationalInsights/workspaces/views",
+ "location": "[resourceGroup().location]",
+ "id": "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE/User Account Security Monitoring",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "Id": "User Account Security Monitoring",
+ "Name": "User Account Security Monitoring",
+ "DisplayName": "User Account Security Monitoring",
+ "Description": "Active Directory Security Audit monitoring solution",
+ "Author": "asithad",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Id": "NumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Logged on Users to Active Directory Domain",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "User Login - Last 24 Hours",
+ "Query": "SecurityEvent | where AccountType =~ \"user\" and EventID == 4624 and TimeGenerated > ago(1d) | summarize count() by Account | count"
+ },
+ "List": {
+ "Query": "SecurityEvent | where AccountType =~ \"user\" and EventID == 4624 | summarize LastLogin = max(TimeGenerated +330m) by Account | sort by LastLogin ",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "User Name",
+ "Value": "Last login - Date and Time"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "3",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "5",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed logon attampts by User",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Users failed most",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "SecurityEvent | where EventID == 4771 | summarize AggregatedValue = count() by TargetUserName | sort by AggregatedValue desc// Oql: Type=SecurityEvent EventID=4771 |measure count() by TargetUserName",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "SecurityEvent | where EventID == 4771 | summarize AggregatedValue = count() by TargetUserName",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "User Name",
+ "Value": "No of Attempt "
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Failed Logon attampt by Computer",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Computers that had most failed logon attampts",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "SecurityEvent | where EventID == 4771 | summarize AggregatedValue = count() by IpAddress | sort by AggregatedValue desc",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "SecurityEvent | where EventID == 4771 | summarize AggregatedValue = count() by IpAddress// Oql: Type=SecurityEvent EventID=4771 |measure count() by IPAddress_CF",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "NumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Locked User Accounts",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "SecurityEvent | where EventID == 4740 | summarize count() by TargetUserName | count",
+ "Legend": "Number of Locked Accounts"
+ },
+ "List": {
+ "Query": "SecurityEvent | where EventID == 4740 | extend Source= TargetDomainName | summarize count() by TargetUserName,Source",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "User Name",
+ "Value": "No of Locked"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "NumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Users Logon Device",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "SecurityEvent | where AccountType =~ \"user\" and EventID == 4624 and TimeGenerated > ago(1d) | summarize count() by Account ",
+ "Legend": "User Name with their logon Computer IP"
+ },
+ "List": {
+ "Query": "SecurityEvent | where EventID == 4624 | where TargetUserName != \"MSOL_d7b788949824\" | extend DeviceIP = IpAddress | extend AccountName = TargetUserName| extend IP=replace(@'::ffff:', @' \\1', DeviceIP) | extend Time =TimeGenerated +330m | summarize by AccountName, IP,Time",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Average",
+ "ColumnsTitle": {
+ "Name": "User Name",
+ "Value": "Updated On"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4RD6RXhpZgAATU0AKgAAAAgABAE7AAIAAAAQAAAISodpAAQAAAABAAAIWpydAAEAAAAgAAAQ0uocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFzaXRoYSBEZSBTaWx2YQAABZADAAIAAAAUAAAQqJAEAAIAAAAUAAAQvJKRAAIAAAADMjEAAJKSAAIAAAADMjEAAOocAAcAAAgMAAAInAAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIwMTg6MDg6MzEgMTU6MTc6MjcAMjAxODowODozMSAxNToxNzoyNwAAAEEAcwBpAHQAaABhACAARABlACAAUwBpAGwAdgBhAAAA/+ELImh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTgtMDgtMzFUMTU6MTc6MjcuMjEzPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPkFzaXRoYSBEZSBTaWx2YTwvcmRmOmxpPjwvcmRmOlNlcT4NCgkJCTwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDAAcFBQYFBAcGBQYIBwcIChELCgkJChUPEAwRGBUaGRgVGBcbHichGx0lHRcYIi4iJSgpKywrGiAvMy8qMicqKyr/2wBDAQcICAoJChQLCxQqHBgcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKir/wAARCACtANUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDkqKKK/Rj82CiiigAooooAKKKKACiiigAooooAKKXFFACUUUUAFFFFABRRRQAUUUtACUUUUDCiiigQUUUUAFFFFABRRRQAUUUUAFFFFABT443lkWOJGd2OFVRkk1d0XRb7xBqkdhpkJlmk/JR3YnsK9+8IeAtM8KW6uqrc37L+8uXXv6L6CuDF46nhVrq+x6GDwNTFO60j3PMdA+EWt6oizaky6bC3IEgzIR/u9vxrutP+Dvhq1UfbDc3r9y8hQH8BXe0V83VzLE1H8Vl5H01HLcNSXw3fmcuvw28JKuBo0R9yxJqnefCfwndIfLs5bZuzRTNx+BOK7SiudYqundTf3nQ8LQas4L7jx3W/grcxK0mg363AHSG4G1j9D0rzbU9Jv9GvDa6nayW0w/hdcZ9x619V1n61oWneILBrTVbZZoz0P8SH1B7V6WHzarB2q6r8TzcTlFKavS0f4HyxRXV+NvAt54RvA4LXGnytiK4x0/2W9D/OuUr6WnUhVgpwd0z5erSnSm4TVmFFFFaGYUUUtABSU5tu47M7c8Z64ptIYUUUUxBRRRQAUUUUAFFFFABRRRQAU+KJ55kiiUvI7BVUDkk0yvQ/g/4fXU/Ekmp3CbodPUFQehkPT8v61hXrKjSdR9DfD0XXqqmup6Z4E8IQ+E9DVHVW1CcBrmT3/uD2FdRRRXw1SpKrNznuz7ynTjSgoQ2QUUUVmaBRRTJ5DFbSygZMaMwHrgZpiH0V47D8a9Rluo4jpFqA8gXPmnjnHpXsZGDXRXwtXD29orXOfD4qliL+zd7FXUtOtdX02ew1CIS2867XU/zHuK+a/FXhy48L+IJ9OuPmVTuhk7SIehr6drgPi74fXU/Cw1KJM3OntuJHUxk4I/kfwrtyzFOjV5H8MvzOLNMKq1FzXxR/I8Hooor64+OCiiigAooooAKKKKACiiigAooooAKKKKACinxRSTyrHCjSOxwqqMk11T/DvV7PSYtS1ZVtIpJ44REeZPnbGcdqynVhTspO1zWnRqVE3FXscnXv3wi08WfgOKfGHvJnlJ9gdo/9Bqu3wm8NaZpN1JJHcXk0cDsHlkIG4L1wuK3vh+Avw/0cD/n3z/48a+fzDGwxFC1Puv1PosvwNTDV71Oz/Q6KmyNsidhztUn8hTqZN/x7y/8AXNv5V4J77PHl+Nepm4Ef9k2mC+377euK9jjbfGjH+JQfzFfKEf8Ax/L/ANdh/wChV9UmQw6d5oGSkG4A98LmvazTD0qPJ7NWvf8AQ8XK8TVrc/tHe1v1J6hvP+Qfc/8AXF/5GvIU+NWqteLCdKssGUJnLdN2PWvXblt+lzt03W7H81rz62Fq4dr2i3PQo4qliFL2b2Ple0/5CUH/AF2X/wBCr6wb7xr5PtP+QlB/12X/ANCr6wb7xr1c63p/P9Dyck+Gp8v1EqC/tFv9NubRxlZ4XjIPuCKnpyjLDFeAm07o+gaurM+SriIwXMsJ6xuyH8Dio69uvPCHgK8v5rN/tCXk0hzdrK2A5PT+719vxryzxZ4Yu/CeuyafdnzFxvhmAwJUPQ+x7Eeor7DB5nh8Y3Gk9UfG43LMTg0p1VozEooor0zywooooAKKKKACiiigAooooAK0NF0W98QarFp+mxeZNIfwQd2J7AVRjjeWRY41Lu5CqoGSSe1dnoviTUvhpqN/p7afaz3TMokZ2JK4HQEdqwrTnGLVPWXRG9CEJSTqaR6s6O0+Hv8AYHjfSLG01m6huLm1lkkuIVUFCuOFyOhzV34haBf6R4Se9fxJqV95U8ZWKfbtzng8DqMVkaV4313xZ45sLnT9OsheW1vKiRvIQjKcZJPrxWt4+k8XX3hf7Lq+n6bBby3Eab4JizBicD8Oa8R+3VemqrV9L7X3Z7q9g6FR0ou3Te2yPPJfHfieWJ45NaumR1KsC3UEV7t4C48BaP8A9e/9TXkVx8I/EtvbSzSfZdsaF2xKOgGa9c8BHPgHRyP+ff8AqanMp0JUV7G2/T0LyyFeNZ+2vt19UdDTJv8Aj3l/65t/Kn02VS0MijqUIH5V4C3Pfex8ox/8fy/9dh/6FX1NP/yB5P8Ar2P/AKBXgqfDDxaLtXOl/KJA2fNXpn6177NE7aa8SjLmAoB77cV7ua1adR0+SSe/6Hg5TRqU1U54tbfqfLMP/IWj/wCvgf8AodfUk3/IIl/69j/6BXg0fwy8WrqCSnS/kEwYnzV6bs+te+Sxs2nSRAfOYCgHvtxRmtWnUcOSSe/6DyqlUpqpzxaufK1p/wAhKD/rsv8A6FX1g33jXz3b/DHxbHexSPpeFWQMT5q9M/WvoQ9TU5vVp1HDkae+3yHk9KpTU+eLW2/zErG8V6v/AGTo5jibFzc5RMdVHc/59a2tyojSSEKiAsxPQAV5Xr2qtrGrSXJyIx8sSnso6f4/jXyWYYn2NKy3Z9dl+H9tVu9kZtbmu6Z/wnfgMqg36xpQ3Rf3pVxyPxA/NR61h1oaHqr6PqsVyuSn3ZFH8Snr/j+FeLluNlgsRGrE9nMsFHG4eVKR490pK7z4qeF00jXE1bT1B07VP3qlfupIeWH0P3h9T6VwlftNCtGvTVSGzPxWvRlQqOnPdCUUUtamIlFFFMQUUUUAFFFFAHV/D77PbeJI9SvrG8vIbQblW1tzLiTtnHTHWmeKo7zxF4w1K903Tb50aQbkNu25OOjDHFei/CW60rSfBzSXWpWdvcXU7OySzqrADgcE+1aPhfWtLh8WeKpJdTs40luozG7TqA429Qc814VTFyhXqTjC7irfij6CnhIzw9OnKdlJ3/BnmngSW58L+MoLnU9MvxmFwsSWzF246hcciu28a+MrbUtChgj0vVYSt5DJuntGRTtbOMnv6CtbUta0yT4naHcJqVo8MdnOryLOpVScYBOeKX4g6zptz4cgSDUrSVxfW7FUmUkAPyeD0rmnV9tXp1JQ1f8Am/I6IUvY4epTjPRX/JeY7UfH9pNpl3GNG1pS8DrlrFgBlep4rU8A8eANH/69/wCpqxqviLRn0i+VNYsGLW7gAXKEk7T71X8A/wDIgaN/17j+Zrz529g7RtqvyZ6ML+3V5X0f5o6GiiiuE7gooooAKKKKACiio7q6isLKW7uDiOJcn39v6UpNRV2OKcnZHN+ONY+zWa6ZA37yYbpSOy+n4n9B71wVWL+9l1G/mu5zl5WyR6DsPwHFek/8IdoX/Pj/AORn/wDiq+YlTqZhVlOD0Xc+mU6eX0owktX2PLqK9R/4Q7Qv+fH/AMjP/wDFUf8ACHaF/wA+P/kZ/wD4qq/sqv3X4/5C/tWh2f4f5nJabBB4s8LXfhjUGAfaZLSRv4GHI/I/oSK8QvrOfTr6ezvIzHPA5jkQ9iDivW7iQ6T4jnex/d/ZrlxGMk4AYjHvxxVP4q6DFqenW3jDS0+WRVjvFH8J6Kx+h+U/8Br6vhjMeVvCVH6f1/XQ+S4ny1SSxdNev9fj955TRS0lffnwAUUUUCFopCrN90geuTRQOwUtJRQI988BeF9EvfAum3N1pdvPNJGS8jx5JOai8NeGdGufFXieGfS7eSO3uY1iVo8hAV6CvHbTxNrVjapbWeqXUMKfdjR8AV3nw00m58UR6rd3WualazCVN7W8gHmcdWyDk18/iMNUpRqVJVNH66an0WHxVKtKnThT1XproVvjFpFhpOoaWmm2cVqskTlxGuNxyK4LSo0k1myR0DK1xGrKR1BYcV6trngO3vPG+k6Tf6vqV3FcW0shkmkUsm3HA+XpVbxR8MdK8O6XBfWN7emb7XDGC7L8u5sZGB1rfD4ulClClKTba3+bMMTg6s6s6sY2Se3yR3uqeD/D8ek3jpo1qrLA7KRF0IWl8AgnwBo/BP8Ao47e5rM1HwM8OmXcn/CT62+yB22tMuGwvQ/L0rN8IeDmv/CGm3Q8RavbebCG8qGVQicngDbXjNRlQfNUvquj7M9pOca65adtH1XdHo+D6H8qMH0P5V5voPhy61XUNagn8S6wi6feeRGUmXLLtByfl680258PXcPjmz0VfEusG3ns3uGczLuDA4wPlxisvq0OZx59lfZ9rmn1mfKpcm7tuu9j0rB9D+VGD6H8q818UeHrvQ7WxltfEusObi+itm8yZeFdsEjC9a0tW8GzWGj3t3F4o1tnt7d5VDTLglVJGfl9qX1eFk+ffyZX1ipdrk280dxg+h/KkciNdzkKo7scVwOh+FJtS8O2eo3XifWkeeASuEmXA9cfLXjeq6vqE99cRPqd5PCkrKnmTscqCQM9q6aGXqvJxjPbfQ5sRmLoQUpQ321PpD/hIdKbVItOhvI57yU/LDCd5x1JJHAAFc3451jzbhdLt2/dw/NKR3bsPw/r7Vh/DvSE8J+EJ/Et9GPt1+u22VhyEPT/AL6I3fQCs6SR5pXklYs7sWZj1JPevmM9q06Evq1J37s+myKlUrx+s1Vbshte2V4nXUf8LA1X/n3s/wDvhv8A4qvJy/E08Pzc/W36nr5hhqlfl5Ol/wBD0SiuVtvFF7N4QvNVaKATwTCNVCttIynUZz/Ee9Yv/CwNV/597P8A74b/AOKr154+hC1+queRDAVp3t0djE1r/kP6h/19Sf8AoRrW8KXsEvn6JqSiSyv1KbW6biMY/EfrisG6uHu7ya5kCh5pGkYL0BJzxUSsVYMpIIOQR2r52nXlSr+1h3PoalCNWh7KfY4XxT4fn8MeIrnTLjLCNt0UhH+sjP3W/wA9wax69r8aaUPG/gZNVtkDarpYPmKo5kTqw/L5h+I714pX7NluNjjMPGot+p+MZlgpYLESpvboFFFFeieabvhu0t7o3P2hFbaE257Z3f4UVjRTyw58qRkz12nrRXNOlOUrqR1U60IxScSOiiiuk5TY8NeHLjxRqhsLOeGGfYXUSnG7HUCvQ/Ael+KNBu9a03SP7Mka3mRZ2uN3XHG3BHFeYaTqdxo2rW2oWbbZreQOvv7H2Ner+FPG8Ta1r2oWuj6ldx3s6OBbwl/LwvQ4rysf7blaSTjb8bo9fL3R5ottqV/wsyfUH8X/APCwdIMyaT9u+yzeSF3+Xt43buc59KPGr+LzocI1VNJEP2yHaYN+7fu+XqemetJqHi4y/EDSL3+wtWUw2syeQ1uRI+ccqMcgd6b438Yi98PxpJomq2iR3cMrS3FuUXCtnGcda82EanPT9xf035npTlT5Knvv+kvI3dRk8dnTLvz49D8vyX37d+cbecfNWb4PfxmPB+mDTU0c2nkjyjNv34yeuGqK/wDjFoNzp9zClteBpYmQZTuRipPCHjE2HhDTbX+wNYuPJhC+bDbFkbk8g45rN0q8aL5qaWq6eT8zVVKMqy5ajej6+a8iLwy/jAap4g+wppJlN/8A6T5u/AfYPu4PTGOtY3i7xL4k8MeMLDUdTg057r7I8cawhtm0nknnOa1/DXi82eqeIJBoWrTfab/zCsVuWMfyAbW44PtXMfEe7vPFniCxWx0bUYpo7Zh5M0BDsM9QMdK6qMG8TapBcttfu9TlrTUcNenN819Pv9CG9+I+s+KrjTtPktbKJhexSRsoYDeGGM89M16FrUnjk6DqH2qPRRAbWTzdm/cF2nOPm64rx2y0jVtF1fT73UNKvYoo7qM/NCQWO4HaM9zXsGteN2udC1CH/hHdaj822kTe9qQq5UjJOOlPF0owlBUIpr+vMnB1ZTjN15NP+vIwZ9c8UaF8Nbe4f+y1sXtlhiPzeaQwPvjOM1w3gLws3irxRDayBjaQ/vbpv9gHpn1J4/M9qTxJ4pbXNL0fS7ZXW2sLcIVPV5O5/LGPxr0/RtNHgHwCkLDZq+pfPMe6cdP+Ag4+pNLFYhZdhJ1ZK0pX/r+urHhcO8xxcKUW3GKX9f10RH4t1Zb/AFIW1rgWloPLjVeAT3P6YH0rBorb8O+Hf7f+0/6V9n8jb/yz3bt2fcelflD9piq2mrZ+rr2eFo66JGJRXbf8K6/6in/kv/8AZUf8K6/6in/kv/8AZVt/Z+J/l/Ff5mP9oYb+b8H/AJFGw/5Jpqf/AF9L/OOuXr0qDwp5Hhm50j7bu+0SiTzfKxt5XjGefu+vesv/AIV1/wBRT/yX/wDsq6a+CxE1C0dlbdd2c9HG4eLneW7vs+yOJortv+Fdf9RT/wAl/wD7KsTxF4d/sD7N/pX2jz93/LPbt249z61x1MHXpRc5xsl5o66eMoVZKEJa+jGeGNY/sjVlaQ/6PN8ko9B2P4f41w/xL8Kf8Iz4laS0TGn32ZbfHRD/ABJ+BPHsRXQV032KPxz4HuNDuGX7faDfayN6j7v4fwn2Ir6DhzMvqtf2U37r/r+vmfP8SZZ9aoe1gveX9f18jweipJoZLa4kgnRo5Y2KOjDBUg4INR1+qH5QFFFFMAooooAK6vwJ41n8IaoSymWwuCBcRDr/ALw9xXKUVnUpxqwcJq6ZpSqzpTU4PVHu174q0O6+ImhahFqtt9lWymDyNIFCE4wGz0Psag+KHiPRtS8Dz29hq1ndTGVCI4plZiBnsDXjuk6m+kajHdxQwzlODHOm5WB6giu61Dxh4a1zQ4IF0iHTr8XULPtjGwoG+bDDtj1rxpYFUqtOUU2o+ne+p7cMf7alUjJpN+va2h5wSOeR+dfQfgrxToNn4L0u3utasYJo4QHjedQynJ6jNaFzpvhq80W8m06102cC3dlaEK2PlPpVLwNoGlXPgfSZrjTLaWR4AWdogSTk965sXi6eJo+/Fqz/AEZ1YPB1MLV9ySd1+qKfhTxNodrq3iV7jWLKJJ9R3xM86gOuxRkc8imXniXRH+KGnXi6vZtbJp0iNMJ12qxPAJz1qbwvo2kNqvif7XYWnlwajtTzUACLsXgZ6CsLxHqfhLRvHtpcNDZz2cdi6yRWyBwZM8A44zWUYU51pKKbfL+hpKdSFGLk0lzef8xseOfEuiXtjpa2er2c7R6nBI4jnViqhhknB6Csn4j/ABMgNpLo/hy4EzTLtuLpDlQp6qp759a4TxX4tg179xp2kWunWituGxB5jfUj+VYFlZT6jfwWdnGZJ53EcaDuScV6eHy+nGMZVPs3dn+p5mIzGpKUo0/tWV1+h3Hwn8LLq2uNq9+oFhphD5bo0nUD6D7x/D1rpNf1ZtY1aS458ofJEp7KP8ev41r6lDB4Q8I2nhrT2BlZN1zIOrE/eP4n9BiuWr8+4hzJ4vEckX7q/r+v+AfoPDuWrCYfnkvef9f1/wAEK7b4df8AMR/7Zf8As9bukaRpsuiWMkmn2ru1vGWZoFJJKjknFaVtZWtnu+yW0MG/G7yowu7HTOPrWGEwEqVSNVy/po6MXj41acqSX9JnjVFev/2LpX/QMs//AAHX/CuD8cWtvaa3DHawRwIbdSVjQKCdzc4FcGIwEqFPncrndh8fGvPkSsc5RRWv4UgiuPE1pFcRJLG2/KOoYH5GPQ1w04c81BdXY7qk+SDm+iuZFdR4r/5AHh7/AK9f/ZY67f8AsXSv+gZZ/wDgOv8AhUsun2U8ccc9nBIkQxGrxKQg9ACOOg/Kvchls4wnHm3t+dzw55lCU4y5dr/lY8bq3pWoyaVqUN3DyUPzL/eXuK9I1fSNNi0S+kj0+1R1t5CrLAoIIU8g4ryyvMxGHnhJx113PTw+Ihi4S002GfFzw3H5sHinS13Wt6ALjaPuvjhvxHB9x715hXvXhqa21jS7vwzqvz290jeXnsepA9x94e4rxbXtGufD+uXWmXo/e277d2OHXqGHsRg1+pZDmKxmGUX8S/r+vkflmf5c8HiXJfDL+vx/zM6iiivoj5wKKKKACiiigAooooAkjnliz5UsiZ67WIzVyDXdVtYFhttRuYo1GAiSEAVn0VLjF7opTlHZk73lzIzl7iVjIdz5c/MfU1DSUU7JbCbb3CvWPhJ4fisbO58XaouI4lZLQEdezMP/AEEfjXm+haW+t69ZabG203Uyxlv7oJ5P4DJr2vxZdwWVvbeHtMXy7WzRQyj1A4H5cn3NfOcQZh9Uw3Kt5f1/Xlc+k4ey/wCt4nnltH+v687HPahey6jfzXc5+eVs49B2H4Cq9FFfkjbk7s/XElFWR6/ov/IA0/8A69Y//QRV2vNrXxxqVpZw20cFqUhjWNSyNkgDHPzVL/wsDVf+fez/AO+G/wDiq+khmWHUUnf7j5ueXV3JtW+89Erzv4gf8h+D/r1X/wBCaj/hYGq/8+9n/wB8N/8AFVjaxrFxrd4tzdJGjrGIwIwQMAk9yfWuXG42jWo8kNzqwWCq0avPPYoVt+Dv+Rss/wDgf/oDViVa03UJdL1CK8t1RpI84DgkcgjsR615NGShVjJ7Jo9atFzpSit2mexUV53/AMLA1X/n3s/++G/+Ko/4WBqv/PvZ/wDfDf8AxVfR/wBp4fu/uPnf7NxHl952+tf8gDUP+vWT/wBBNeQV0d1441K7s5raSC1CTRtGxVGyARjj5q5yvIx+Ip15RcOh62Aw9ShFqfUfBNJbXCTQsUkjYMrDsRWl8SNFj8VeE4PE2nR/6XZptuUUclO//fJ5+hNZVdH4M1L7PqhsJwHtrwbGVuRuxx+fT8a6Mnx0sHiU1sznzjARxmGcXujwqitjxZpiaN4u1PT4V2xQ3DCNSeiHlR+RFFfssJKcVJdT8YnFwk4voY9FLRVEiUUtFACUUtFACUUtFACUUtFAGj4e1c6D4isdTEfmC2mDsgONw7j8s17FLqHg/wAVP/aMHiCDTZpQDJFdMqEHHoxH6HFeGUV5eYZXQzBJVeh6uX5riMvb9l1Pb/7I8N/9DrpX/f2P/wCOUf2R4b/6HXSv+/sf/wAcrxCivG/1UwXn+P8Amez/AK2Y3sv6+R7f/ZHhv/oddK/7+x//AByj+yPDf/Q66V/39j/+OV4hRR/qpgvP8f8AMP8AWzG9l/XyPb/7I8N/9DrpX/f2P/45R/ZHhv8A6HXSv+/sf/xyvEKKP9VMF5/j/mH+tmN7L+vke3/2R4b/AOh10r/v7H/8co/sjw3/ANDrpX/f2P8A+OV4hRR/qpgvP8f8w/1sxvZf18j2/wDsjw3/ANDrpX/f2P8A+OUf2R4b/wCh10r/AL+x/wDxyvEKSj/VTBef4/5h/rZjey/r5HuH9keG/wDoddK/7+x//HKP7I8N/wDQ66V/39j/APjleH0Uf6qYLz/H/MP9bMd2X9fI9w/sjw3/ANDrpX/f2P8A+OVJbXfg/wAN3K3114ltr54gWjjtiHyfopPP5V4YKKunwtgoSUtdCKnFONnFx01NHxDqv9t+I7/UgrItzO0iq3VVzwD+GKKzqK+ojFRiorofLSk5Scnuz//Z",
+ "Label": "Security Audit",
+ "Link": {
+ "Label": "More info",
+ "Url": "http://asitha.info/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Active Directory Security Audit Solution",
+ "Content": "## User Account Security Monitoring View\n1. Domain logged on users last 24 hours\n2. User logging failures\n3. Computers where users failed to login\n4. All Locked accounts last 24 hours\n5. Finding users logged on computer (IP)\n\n\nPost your feedback and Let us know how to improve this solution \n\n#### Solution by Asitha De Silva"
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "SingleNumberBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "Tile": {
+ "Legend": "Faild Login Attampts",
+ "Query": "SecurityEvent | where AccountType =~ \"user\" and EventID == 4625 | summarize Failed = count() by Account| count // Oql: Type=SecurityEvent AccountType=user EventID=4625 | measure count() as Failed by Account"
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "search *// Oql: *",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT744 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT744
new file mode 100644
index 0000000..bb34a46
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT744
@@ -0,0 +1,406 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-all-deploy/nestedtemplates/omsAutomation.json"
+ ],
+ "timestamp": 1642962900609,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-all-deploy/nestedtemplates/omsAutomation.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT744",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT744",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the Automation account"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the region for your Automation account"
+ }
+ },
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the OMS workspace"
+ }
+ },
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the ASR Recovery Vault"
+ }
+ },
+ "azureAdmin": {
+ "type": "string",
+ "metadata": {
+ "description": "Enter your service admin user"
+ }
+ },
+ "azureAdminPwd": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Enter the pwd for the service admin user. The pwd is enrypted during runtime and in the Automation assets"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ }
+ },
+ "variables": {
+ "psModules": {
+ "azureRmProfile": {
+ "name": "AzureRm.Profile",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.profile.2.8.0.nupkg"
+ },
+ "azureRmResources": {
+ "name": "AzureRm.Resources",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.resources.3.8.0.nupkg"
+ },
+ "azureStorage": {
+ "name": "Azure.Storage",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azure.storage.2.8.0.nupkg"
+ },
+ "azureRmStorage": {
+ "name": "AzureRm.Storage",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.storage.2.8.0.nupkg"
+ },
+ "azureRmOperationalInsights": {
+ "name": "AzureRm.OperationalInsights",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.operationalinsights.2.8.0.nupkg"
+ },
+ "azureRmSiteRecovery": {
+ "name": "AzureRm.SiteRecovery",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.siterecovery.3.7.0.nupkg"
+ },
+ "azureRmRecoveryServices": {
+ "name": "AzureRm.RecoveryServices",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.recoveryservices.2.8.0.nupkg"
+ },
+ "azureRmBackup": {
+ "name": "AzureRm.Backup",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.backup.2.8.0.nupkg"
+ },
+ "azureRmCompute": {
+ "name": "AzureRm.Compute",
+ "url": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.compute.2.9.0.nupkg"
+ }
+ },
+ "runbooks": {
+ "omsABUscript": {
+ "name": "AzureIaasBackup",
+ "version": "1.0.0.0",
+ "description": "Runbook to automatically backup IaaS VMs within the ABU region",
+ "type": "PowerShell"
+ }
+ },
+ "scriptUri": "[uri(parameters('_artifactsLocation'), concat('scripts/Automated-IaaS-Backup.ps1', parameters('_artifactsLocationSasToken')))]",
+ "azureSubscriptionId": "AzureSubscriptionId",
+ "omsWorkspaceId": "OMSWorkspaceId",
+ "omsWorkspaceKey": "OMSWorkspacekey",
+ "omsWorkspaceNameAsset": "OMSWorkspaceName",
+ "omsResourceGroupName": "OMSResourceGroupName",
+ "omsRecoveryVault": "OMSRecoveryVault",
+ "azureCredentials": "AzureCredentials"
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-04-01",
+ "location": "location",
+ "name": "",
+ "type": "Microsoft.Automation/automationAccounts",
+ "comments": "Automation account for OMS",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "OMSWorkspaceId",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts// parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "description": "OMS Workspace Id",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')),'2020-10-01').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "OMSWorkspacekey",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "description": "OMS Workspace key",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2020-10-01').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "OMSRecoveryVault",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "description": "OMS Recovery Vault Name",
+ "value": "\"parameters('omsRecoveryVaultName')\""
+ }
+ },
+ {
+ "name": "OMSResourceGroupName",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "description": "OMS Recovery Vault Name",
+ "value": "[concat('\"',resourceGroup().name,'\"')]"
+ }
+ },
+ {
+ "name": "AzureCredentials",
+ "type": "credentials",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "description": "Azure Subscription Credentials",
+ "password": "azureAdminPwd",
+ "userName": "azureAdmin"
+ }
+ },
+ {
+ "name": "OMSWorkspaceName",
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "description": "OMS Recovery Vault Name",
+ "value": "\"parameters('omsWorkspaceName')\""
+ }
+ },
+ {
+ "name": "(psModules).azureRmOperationalInsights.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmOperationalInsights.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmResources.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmResources.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmStorage.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmStorage.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureStorage.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureStorage.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmCompute.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmCompute.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmSiteRecovery.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmSiteRecovery.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmBackup.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmBackup.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmRecoveryServices.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules/omsautomationAccountName/(psModules).azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmRecoveryServices.url"
+ }
+ }
+ },
+ {
+ "name": "(psModules).azureRmProfile.name",
+ "type": "Modules",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(psModules).azureRmProfile.url"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).omsABUscript.name",
+ "type": "runbooks",
+ "apiVersion": "2019-06-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/variables/ parameters('omsAutomationAccountName')/AzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/variables/ parameters('omsAutomationAccountName')/OMSWorkspaceId",
+ "Microsoft.Automation/automationAccounts/variables/ parameters('omsAutomationAccountName')/OMSWorkspacekey",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmProfile.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmResources.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmCompute.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureStorage.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmStorage.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmRecoveryServices.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmSiteRecovery.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmBackup.name",
+ "Microsoft.Automation/automationAccounts/Modules/ parameters('omsAutomationAccountName')/(psModules).azureRmOperationalInsights.name"
+ ],
+ "properties": {
+ "runbookType": "(runbooks).omsABUscript.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).omsABUscript.description",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/Automated-IaaS-Backup.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "(runbooks).omsABUscript.version"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT745 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT745
new file mode 100644
index 0000000..75b865d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT745
@@ -0,0 +1,155 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-all-deploy/nestedtemplates/omsRecoveryServices.json"
+ ],
+ "timestamp": 1642962900617,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-all-deploy/nestedtemplates/omsRecoveryServices.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT745",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.recoveryservices/vaults",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT745",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Assign a name for the ASR Recovery Vault"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the region for your Recovery Vault"
+ }
+ }
+ },
+ "variables": {
+ "recoveryStorageAccountName": "[toLower(concat('asr', uniqueString(resourceGroup().id)))]",
+ "recoveryStorageType": "Standard_LRS"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-02-02",
+ "location": "location",
+ "name": "",
+ "type": "Microsoft.RecoveryServices/vaults",
+ "comments": "ASR Recovery Vault for OMS",
+ "sku": {
+ "name": "RS0",
+ "tier": "Standard"
+ },
+ "properties": {},
+ "resources": [
+ {
+ "apiVersion": "2016-06-01",
+ "name": "HyperVPrimarySite",
+ "type": "replicationFabrics",
+ "id": "Microsoft.RecoveryServices/vaults/replicationFabrics/ parameters('omsRecoveryVaultName')/HyperVPrimarySite",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults// parameters('omsRecoveryVaultName')"
+ ],
+ "properties": {
+ "friendlyName": "PrimarySite",
+ "fabricType": "HyperVSite"
+ }
+ },
+ {
+ "apiVersion": "2020-02-02",
+ "name": "DefaultVMwarePolicy",
+ "type": "replicationPolicies",
+ "id": "Microsoft.RecoveryServices/vaults/replicationPolicies/ parameters('omsRecoveryVaultName')/DefaultVMwarePolicy",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults/ parameters('omsRecoveryVaultName')"
+ ],
+ "properties": {
+ "subscriptionid": "[subscription().subscriptionId]",
+ "friendlyName": "DefaultVMwarePolicy",
+ "providerSpecificInput": {
+ "instanceType": "InMageAzureV2",
+ "crashConsistentFrequencyInMinutes": 5,
+ "recoveryPointThresholdInMinutes": 15,
+ "recoveryPointHistory": 1440,
+ "appConsistentFrequencyInMinutes": 60,
+ "multiVmSyncStatus": "Enable"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-02-02",
+ "name": "DefaultVMwarePolicy-failback",
+ "type": "replicationPolicies",
+ "id": "Microsoft.RecoveryServices/vaults/replicationPolicies/ parameters('omsRecoveryVaultName')/DefaultVMwarePolicy-failback",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults/ parameters('omsRecoveryVaultName')",
+ "Microsoft.RecoveryServices/vaults/replicationPolicies/ parameters('omsRecoveryVaultName')/DefaultVMwarePolicy"
+ ],
+ "properties": {
+ "subscriptionid": "[subscription().subscriptionId]",
+ "friendlyName": "DefaultVMwarePolicy-failback",
+ "providerSpecificInput": {
+ "instanceType": "InMage",
+ "recoveryPointThresholdInMinutes": 15,
+ "recoveryPointHistory": 1440,
+ "appConsistentFrequencyInMinutes": 60,
+ "multiVmSyncStatus": "Enable"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-02-02",
+ "name": "DefaultHyperVPolicy",
+ "type": "replicationPolicies",
+ "id": "Microsoft.RecoveryServices/vaults/replicationPolicies/ parameters('omsRecoveryVaultName')/DefaultHyperVPolicy",
+ "dependsOn": [
+ "Microsoft.RecoveryServices/vaults// parameters('omsRecoveryVaultName')"
+ ],
+ "properties": {
+ "subscriptionId": "[subscription().subscriptionId]",
+ "friendlyName": "DefaultHyperVPolicy",
+ "providerSpecificInput": {
+ "instanceType": "HyperVReplicaAzure",
+ "recoveryPointHistoryDurationInHours": 2,
+ "applicationConsistentSnapshotFrequencyInHours": 0,
+ "replicationInterval": 900,
+ "activeStorageAccountId": "[reference(resourceId('Microsoft.Storage/storageAccounts/',variables('recoveryStorageAccountName')))]",
+ "encryption": "Disable"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "location": "location",
+ "name": "[toLower(concat('asr', uniqueString(resourceGroup().id)))]",
+ "type": "Microsoft.Storage/storageAccounts",
+ "comments": "Storage account for ASR",
+ "properties": {
+ "accountType": "Standard_LRS"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT746 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT746
new file mode 100644
index 0000000..930fec5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT746
@@ -0,0 +1,1043 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-all-deploy/nestedtemplates/omsWorkspace.json"
+ ],
+ "timestamp": 1642962900624,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-all-deploy/nestedtemplates/omsWorkspace.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT746",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT746",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Assign a name for the Log Analytic Workspace Name"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the region for your Workspace"
+ }
+ }
+ },
+ "variables": {
+ "batch1": {
+ "solutions": [
+ {
+ "name": "Security(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "Security"
+ },
+ {
+ "name": "AgentHealthAssessment(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AgentHealthAssessment"
+ },
+ {
+ "name": "ChangeTracking(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "ChangeTracking"
+ },
+ {
+ "name": "Updates(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "Updates"
+ },
+ {
+ "name": "AzureActivity(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AzureActivity"
+ },
+ {
+ "name": "AzureAutomation(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "AzureAutomation"
+ },
+ {
+ "name": "ADAssessment(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "ADAssessment"
+ },
+ {
+ "name": "SQLAssessment(, parameters(omsWorkspaceName), )",
+ "marketplaceName": "SQLAssessment"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "location": "location",
+ "name": "omsWorkspaceName",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "comments": "Log Analytics workspace",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ },
+ "retentionInDays": 180
+ },
+ "resources": [
+ {
+ "name": "AzureActivityLog",
+ "type": "datasources",
+ "apiVersion": "2015-11-01-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "AzureActivityLog",
+ "properties": {
+ "linkedResourceId": "[subscriptionResourceId('Microsoft.Insights/eventTypes', 'management')]"
+ }
+ },
+ {
+ "apiVersion": "2017-03-15-preview",
+ "name": "omsWorkspaceName/HyperV1",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "HyperV",
+ "displayName": "VMs created last 24 hours",
+ "query": "Event | where EventLog == \"Microsoft-Windows-Hyper-V-VMMS-Admin\" and EventID == 13003 and EventLevelName =~ \"information\" and TimeGenerated > ago(1d)"
+ }
+ },
+ {
+ "apiVersion": "2017-03-15-preview",
+ "name": "omsWorkspaceName/HyperV2",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "HyperV",
+ "displayName": "VMs deleted last 24 hours",
+ "Query": "Event | where EventLog == \"Microsoft-Windows-Hyper-V-VMMS-Admin\" and EventID == 13003 and EventLevelName =~ \"information\" and TimeGenerated > ago(1d)"
+ }
+ },
+ {
+ "apiVersion": "2017-03-15-preview",
+ "name": "omsWorkspaceName/HyperV3",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "HyperV",
+ "displayName": "Replication throughput per VM over last 24 hours",
+ "query": "Perf | where ObjectName == \"Hyper-V Azure Replication Agent\" and CounterName == \"Replication Throughput\" and TimeGenerated > ago(1d) | summarize AggregatedValue = avg(CounterValue) by InstanceName, bin(TimeGenerated, 15m)"
+ }
+ },
+ {
+ "name": "omsWorkspaceName/SoftwareUpdateFailed1",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "Software Updates",
+ "displayName": "Failed Software Updates in the last week",
+ "query": "Event | where EventID == 20 and Source == \"Microsoft-Windows-WindowsUpdateClient\" and EventLog == \"System\" and TimeGenerated > ago(7d)"
+ }
+ },
+ {
+ "name": "omsWorkspaceName/Network1",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "Networking",
+ "displayName": "NICs disconnected from the network in last 24 hours",
+ "query": "Event | where EventLog == \"System\" and Source == \"TCPIP\" and EventID == 4202 and TimeGenerated > ago(24h) | summarize AggregatedValue = count() by Computer"
+ }
+ },
+ {
+ "name": "omsWorkspaceName/Network2",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "Networking",
+ "displayName": "Duplicate IP addresses detected in the last 24 hours",
+ "query": "Event | where (EventID == 4198 or EventID == 4199) and Source == \"TCPIP\" and EventLog == \"System\" and TimeGenerated > ago(24h)"
+ }
+ },
+ {
+ "name": "omsWorkspaceName/NTFS1",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "NTFS",
+ "displayName": "NTFS File System Corruption in the last 24 hours",
+ "query": "Event | where EventLog == \"System\" and EventID == 98 and Source =~ \"Microsoft-Windows-Ntfs\" and TimeGenerated > ago(1d) | summarize AggregatedValue = count() by Computer"
+ }
+ },
+ {
+ "name": "omsWorkspaceName/NTFS2",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "ETag": "*",
+ "category": "NTFS",
+ "displayName": "NTFS User Disk Quota Reached",
+ "query": "Event | where EventLog == \"System\" and (EventID == 40 or EventID == 36) and Source =~ \"Disk\" and TimeGenerated > ago(24h) | summarize AggregatedValue = count() by Computer"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk1",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Avg Disk sec/Read"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk2",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Avg Disk sec/Write"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk3",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Current Disk Queue Length"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk4",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Disk Reads/sec"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk5",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Disk Transfers/sec"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk6",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Disk Writes/sec"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk7",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Free Megabytes"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LogicalDisk8",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "LogicalDisk",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "% Free Space"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Memory1",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Memory",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Available MBytes"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Memory2",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Memory",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "% Committed Bytes In Use"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Network1",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Network Adapter",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Bytes Received/sec"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Network2",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Network Adapter",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Bytes Sent/sec"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Network3",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Network Adapter",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Bytes Total/sec"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "CPU1",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Processor",
+ "instanceName": "_Total",
+ "intervalSeconds": 10,
+ "counterName": "% Processor Time"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "CPU2",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "System",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Processor Queue Lenght"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "System",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsEvent",
+ "properties": {
+ "eventLogName": "System",
+ "eventTypes": [
+ {
+ "eventType": "Error"
+ },
+ {
+ "eventType": "Warning"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Application",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsEvent",
+ "properties": {
+ "eventLogName": "Application",
+ "eventTypes": [
+ {
+ "eventType": "Error"
+ },
+ {
+ "eventType": "Warning"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Microsoft-Windows-Hyper-V-VMMS-Admin",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsEvent",
+ "properties": {
+ "eventLogName": "Microsoft-Windows-Hyper-V-VMMS-Admin",
+ "eventTypes": [
+ {
+ "eventType": "Error"
+ },
+ {
+ "eventType": "Warning"
+ },
+ {
+ "eventType": "Information"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent1",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Average Replication Size"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent2",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Replication Throughput"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent3",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Network Send Throughput"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent4",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Replication Count"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent5",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Network Bytes Sent"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent6",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Last Replication Size"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Hyper-VAzureReplicationAgent7",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "WindowsPerformanceCounter",
+ "properties": {
+ "objectName": "Hyper-V Azure Replication Agent",
+ "instanceName": "*",
+ "intervalSeconds": 10,
+ "counterName": "Resynchronized Bytes"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Linux",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "LinuxPerformanceObject",
+ "properties": {
+ "performanceCounters": [
+ {
+ "counterName": "% Used Inodes"
+ },
+ {
+ "counterName": "Free Megabytes"
+ },
+ {
+ "counterName": "% Used Space"
+ },
+ {
+ "counterName": "Disk Transfers/sec"
+ },
+ {
+ "counterName": "Disk Reads/sec"
+ },
+ {
+ "counterName": "Disk Writes/sec"
+ }
+ ],
+ "objectName": "Logical Disk",
+ "instanceName": "*",
+ "intervalSeconds": 10
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "LinuxPerfCollection",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "LinuxPerformanceCollection",
+ "properties": {
+ "state": "Enabled"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "IISLog",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "IISLogs",
+ "properties": {
+ "state": "OnPremiseEnabled"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "Syslog",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "LinuxSyslog",
+ "properties": {
+ "syslogName": "kern",
+ "syslogSeverities": [
+ {
+ "severity": "emerg"
+ },
+ {
+ "severity": "alert"
+ },
+ {
+ "severity": "crit"
+ },
+ {
+ "severity": "err"
+ },
+ {
+ "severity": "warning"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "datasources",
+ "name": "SyslogCollection",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "kind": "LinuxSyslogCollection",
+ "properties": {
+ "state": "Enabled"
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(variables('batch1').solutions[copyIndex()].Name)]",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName"
+ },
+ "plan": {
+ "name": "(batch1).solutions[copyIndex()].name",
+ "product": "[concat('OMSGallery/', variables('batch1').solutions[copyIndex()].marketplaceName)]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT747 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT747
new file mode 100644
index 0000000..13cdebb
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT747
@@ -0,0 +1,187 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-all-deploy/azuredeploy.json",
+ "/demos/oms-all-deploy/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900635,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-all-deploy/azuredeploy.json",
+ "/demos/oms-all-deploy/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT747",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT747",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsRecoveryVaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "Assign a name for the ASR Recovery Vault"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specify the region for your Recovery Vault"
+ }
+ },
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Assign a name for the Log Analytic Workspace Name"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Assign a name for the Automation account"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "azureAdmin": {
+ "type": "string",
+ "metadata": {
+ "description": "Enter your service admin user"
+ },
+ "value": "azureadmin"
+ },
+ "azureAdminPwd": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Enter the pwd for the service admin user. The pwd is enrypted during runtime and in the Automation assets"
+ },
+ "value": "GEN-PASSWORD"
+ }
+ },
+ "variables": {
+ "nestedTemplates": {
+ "omsRecoveryServices": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/omsRecoveryServices.json', parameters('_artifactsLocationSasToken')))]",
+ "omsAutomation": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/omsAutomation.json', parameters('_artifactsLocationSasToken')))]",
+ "omsWorkspace": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/omsWorkspace.json', parameters('_artifactsLocationSasToken')))]"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "omsWorkspace",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//omsRecoveryServices"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsWorkspace",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "omsRecoveryServices",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsRecoveryServices",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsRecoveryVaultName": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "omsAutomation",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//omsRecoveryServices",
+ "Microsoft.Resources/deployments//omsWorkspace"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsAutomation",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsAutomationAccountName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "omsRecoveryVaultName": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "omsWorkspaceName": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "azureAdmin": {
+ "value": "azureadmin"
+ },
+ "azureAdminPwd": {
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT748 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT748
new file mode 100644
index 0000000..d73fd50
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT748
@@ -0,0 +1,401 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-automation-solution/azuredeploy.json",
+ "/demos/oms-automation-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900648,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-automation-solution/azuredeploy.json",
+ "/demos/oms-automation-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT748",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT748",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources"
+ }
+ },
+ "workspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specify the workspace name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "workspaceSku": {
+ "type": "string",
+ "defaultValue": "standard",
+ "allowedValues": [
+ "free",
+ "pernode",
+ "standard"
+ ],
+ "metadata": {
+ "description": "Select the SKU for your workspace"
+ },
+ "value": "free"
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "AzureAutomationJobMonitoring",
+ "solutionName": "[concat('AzureAutomationJobMonitoring', '[', parameters('workspaceName'), ']')]",
+ "publisher": "cameron.fuller@catapultsystems.com",
+ "displayName": "Azure Automation Job Monitoring",
+ "description": "Monitor automation runbook jobs",
+ "author": "cameron.fuller@catapultsystems.com"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "free"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "Name": "Azure Automation Job Monitoring",
+ "Author": "cameron.fuller@catapultsystems.com",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Recent Azure Automation Jobs",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs run"
+ },
+ "Donut": {
+ "Query": "Category=JobLogs | measure count() by RunbookName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Category=JobLogs | measure count() by RunbookName_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Name",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Recent Azure Automation Jobs",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Jobs run"
+ },
+ "LineChart": {
+ "Query": "Category=JobLogs NOT(ResultType=\"started\") | measure Count() by RunbookName_s | display linechart",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "Category=JobLogs NOT(ResultType=\"started\") | measure Count() by RunbookName_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Type",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Recent Azure Automation Job",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Result"
+ },
+ "Donut": {
+ "Query": "Category=JobLogs | measure count() by ResultType",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Category=JobLogs | measure count() by ResultType",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Results",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Recent Azure Automation Job Streams",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Job Streams"
+ },
+ "Donut": {
+ "Query": "Category=JobStreams | measure count() by RunbookName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Category=JobStreams | measure count() by RunbookName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "Donut": {
+ "Query": "Category=JobLogs | measure count() by RunbookName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT749 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT749
new file mode 100644
index 0000000..b3b9884
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT749
@@ -0,0 +1,1390 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.json",
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900658,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.json",
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT749",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT749",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Create a new or use an existing log analytics workspace."
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "wescentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ },
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the SKU for Log Analytics"
+ },
+ "value": "standalone"
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ },
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ },
+ "value": "eastus2"
+ },
+ "omsDataIngestionFrequency": {
+ "type": "string",
+ "defaultValue": "Hourly",
+ "allowedValues": [
+ "Hourly",
+ "Daily"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Usage data retrieval frequency"
+ },
+ "value": "Hourly"
+ },
+ "currency": {
+ "type": "string",
+ "defaultValue": "USD",
+ "allowedValues": [
+ "ARS",
+ "AUD",
+ "BRL",
+ "CAD",
+ "CHF",
+ "DKK",
+ "EUR",
+ "GBP",
+ "HKD",
+ "IDR",
+ "INR",
+ "JPY",
+ "KRW",
+ "MXN",
+ "MYR",
+ "NOK",
+ "NZD",
+ "RUB",
+ "SAR",
+ "SEK",
+ "TRY",
+ "TWD",
+ "USD",
+ "ZAR"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Billing Currency"
+ },
+ "value": "USD"
+ },
+ "regionInfo": {
+ "type": "string",
+ "defaultValue": "United States",
+ "allowedValues": [
+ "Afghanistan",
+ "Albania",
+ "Algeria",
+ "Angola",
+ "Argentina",
+ "Armenia",
+ "Australia",
+ "Austria",
+ "Azerbaijan",
+ "Bahamas",
+ "Bahrain",
+ "Bangladesh",
+ "Barbados",
+ "Belarus",
+ "Belgium",
+ "Belize",
+ "Bermuda",
+ "Bolivia",
+ "Bosnia and Herzegovina",
+ "Botswana",
+ "Brazil",
+ "Brunei",
+ "Bulgaria",
+ "Cameroon",
+ "Canada",
+ "Cape Verde",
+ "Cayman Islands",
+ "Chile",
+ "Colombia",
+ "Costa Rica",
+ "Cote D'Ivoire",
+ "Croatia",
+ "Curacao",
+ "Cyprus",
+ "Czech Republic",
+ "Denmark",
+ "Dominican Republic",
+ "Ecuador",
+ "Egypt",
+ "El Salvador",
+ "Estonia",
+ "Ethiopia",
+ "Faroe Islands",
+ "Fiji",
+ "Finland",
+ "France",
+ "Georgia",
+ "Germany",
+ "Ghana",
+ "Greece",
+ "Guatemala",
+ "Honduras",
+ "Hong Kong SAR",
+ "Hungary",
+ "Iceland",
+ "India",
+ "Indonesia",
+ "Iraq",
+ "Ireland",
+ "Israel",
+ "Italy",
+ "Jamaica",
+ "Japan",
+ "Jordan",
+ "Kazakhstan",
+ "Kenya",
+ "Korea",
+ "Kuwait",
+ "Kyrgyzstan",
+ "Latvia",
+ "Lebanon",
+ "Libya",
+ "Liechtenstein",
+ "Lithuania",
+ "Luxembourg",
+ "Macao SAR",
+ "Macedonia, FYRO",
+ "Malaysia",
+ "Malta",
+ "Mauritius",
+ "Mexico",
+ "Moldova",
+ "Monaco",
+ "Mongolia",
+ "Montenegro",
+ "Morocco",
+ "Namibia",
+ "Nepal",
+ "Netherlands",
+ "New Zealand",
+ "Nicaragua",
+ "Nigeria",
+ "Norway",
+ "Oman",
+ "Pakistan",
+ "Palestinian Territory",
+ "Panama",
+ "Paraguay",
+ "Peru",
+ "Philippines",
+ "Poland",
+ "Portugal",
+ "Puerto Rico",
+ "Qatar",
+ "Romania",
+ "Russia",
+ "Rwanda",
+ "Saint Kitts and Nevis",
+ "Saudi Arabia",
+ "Senegal",
+ "Serbia",
+ "Singapore",
+ "Slovakia",
+ "Slovenia",
+ "South Africa",
+ "Spain",
+ "Sri Lanka",
+ "Sweden",
+ "Switzerland",
+ "Taiwan",
+ "Tajikistan",
+ "Tanzania",
+ "Thailand",
+ "Trinidad and Tobago",
+ "Tunisia",
+ "Turkey",
+ "Turkmenistan",
+ "U.S. Virgin Islands",
+ "Uganda",
+ "Ukraine",
+ "United Arab Emirates",
+ "United Kingdom",
+ "United States",
+ "Uruguay",
+ "Uzbekistan",
+ "Venezuela",
+ "Vietnam",
+ "Yemen",
+ "Zambia",
+ "Zimbabwe"
+ ],
+ "metadata": {
+ "description": "Specify region for Azure BillingSee https://github.com/Azure/azure-content-nlnl/blob/master/articles/billing-countries-and-currencies.md for details."
+ },
+ "value": "United States"
+ },
+ "locale": {
+ "type": "string",
+ "defaultValue": "en-US",
+ "allowedValues": [
+ "en-AU",
+ "ar-AE",
+ "ar-BH",
+ "ar-DZ",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-OM",
+ "ar-QA",
+ "ar-SA",
+ "ar-TN",
+ "ar-YE",
+ "bg-BG",
+ "ca-ES",
+ "cs-CZ",
+ "da-DK",
+ "de-AT",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el-CY",
+ "el-GR",
+ "en-AE",
+ "en-BZ",
+ "en-CA",
+ "en-DZ",
+ "en-GB",
+ "en-HK",
+ "en-IE",
+ "en-IN",
+ "en-JM",
+ "en-JO",
+ "en-KE",
+ "en-MT",
+ "en-MY",
+ "en-NG",
+ "en-NZ",
+ "en-PH",
+ "en-SG",
+ "en-SI",
+ "en-SK",
+ "en-TH",
+ "en-TT",
+ "en-US",
+ "en-ZA",
+ "en-ZW",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-DO",
+ "es-EC",
+ "es-ES",
+ "es-GT",
+ "es-HN",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et-EE",
+ "eu-ES",
+ "fi-FI",
+ "fr-BE",
+ "fr-CA",
+ "fr-CH",
+ "fr-DZ",
+ "fr-FR",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-SN",
+ "fr-TN",
+ "gl-ES",
+ "he-IL",
+ "hi-IN",
+ "hr-HR",
+ "hu-HU",
+ "id-ID",
+ "it-CH",
+ "it-IT",
+ "ja-JP",
+ "kk-KZ",
+ "ko-KR",
+ "lt-LT",
+ "lv-LV",
+ "ms-BN",
+ "ms-MY",
+ "nb-NO",
+ "nl-BE",
+ "nl-NL",
+ "pl-PL",
+ "pt-BR",
+ "pt-PT",
+ "ro-RO",
+ "ru-BY",
+ "ru-KZ",
+ "ru-RU",
+ "ru-UA",
+ "sk-SK",
+ "sl-SI",
+ "sr-Cyrl-RS",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv-FI",
+ "sv-SE",
+ "th-TH",
+ "tr-TR",
+ "uk-UA",
+ "vi-VN",
+ "zh-CN",
+ "zh-HK",
+ "zh-MO",
+ "zh-SG",
+ "zh-TW"
+ ],
+ "metadata": {
+ "description": "Specify locale for Azure Billing. See https://github.com/Azure/azure-content-nlnl/blob/master/articles/billing-countries-and-currencies.md for details."
+ },
+ "value": "en-US"
+ },
+ "offerDurableId": {
+ "type": "string",
+ "allowedValues": [
+ "MS-AZR-0003P : Pay-As-You-Go",
+ "MS-AZR-0041P : Support Plans",
+ "MS-AZR-0042P : Support Plans",
+ "MS-AZR-0043P : Support Plans",
+ "MS-AZR-0044P : Free Trial",
+ "MS-AZR-0059P : Visual Studio Professional subscribers",
+ "MS-AZR-0060P : Visual Studio Test Professional subscribers",
+ "MS-AZR-0062P : MSDN Platforms subscribers",
+ "MS-AZR-0063P : Visual Studio Enterprise subscribers",
+ "MS-AZR-0064P : Visual Studio Enterprise (BizSpark) subscribers",
+ "MS-AZR-0029P : Visual Studio Enterprise (MPN) subscribers",
+ "MS-AZR-0022P : Visual Studio Dev Essentials members",
+ "MS-AZR-0023P : Pay-As-You-Go Dev/Test",
+ "MS-AZR-0148P : Enterprise Dev/Test",
+ "MS-AZR-0025P : Action Pack",
+ "MS-AZR-0036P : Microsoft Azure Sponsored Offer",
+ "MS-AZR-0120P : Azure Pass",
+ "MS-AZR-0130P : Azure Pass",
+ "MS-AZR-0111p : Azure in Open Licensing",
+ "MS-AZR-0144P : Microsoft Imagine",
+ "MS-AZR-0149P : BizSpark Plus",
+ "MS-AZR-0145P : Azure in CSP",
+ "MS-AZR-DE-0145P : Azure Germany in CSP for Microsoft Cloud Germany",
+ "MS-AZR-0044P : Azure Germany Free Trial",
+ "MS-AZR-DE-0003P : Azure Germany Pay-As-You-Go",
+ "MS-AZR-DE-0041P : Azure Germany Support Plans",
+ "MS-AZR-DE-0042P : Azure Germany Support Plans",
+ "MS-AZR-DE-0043P : Azure Germany Support Plans",
+ "MS-AZR-0051p : Azure NotInUse"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Offer ID available in subscription details from Azure Portal"
+ },
+ "value": "MS-AZR-0003P : Pay-As-You-Go"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-resource-usage-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ },
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "ingestSchedulerGuid": {
+ "type": "string",
+ "defaultValue": "cb466319-e0a8-42e4-b993-36dc45c0b158",
+ "metadata": {
+ "description": "GUID for the schedule creation - create a unique before deploy"
+ },
+ "value": "2c84767f-feaf-47b1-9bc0-e9280ec740b1"
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestParentRunbook": {
+ "name": "AzureUsage-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Usage data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureUsage-Schedules-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "parentRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure Usage",
+ "solutionName": "[concat('AzureUsage', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Usage",
+ "description": "Monitor Azure Usage",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureUsage-OPSINSIGHTS_WS_ID",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureUsage-OPSINSIGHTS_WS_KEY",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureUsage-AzureAutomationAccount-MS-Mgmt",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureUsage-AzureAutomationResourceGroup-MS-Mgmt",
+ "createScheduleResourceGroupType": "string",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "omsAutomationSku": "basic",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "ingestScheduleName": "AzureUsage-Scheduler-",
+ "propagatetags": "1"
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-20",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "properties": {
+ "sku": {
+ "name": "standalone"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.name",
+ "dependsOn": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "DisplayName": "(omsSolutions).customSolution.displayName",
+ "Description": "(omsSolutions).customSolution.description",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Azure Offer Types",
+ "Link": {
+ "Label": "More info",
+ "Url": "https://azure.microsoft.com/en-us/support/legal/offer-details/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Here Are the Common Azure Offers",
+ "Content": "[concat('Pay-As-You-Go **0003P** \nAzure Dynamics **0033P** \nFree Trial **0044P** \nVisual Studio Professional **0059P** \nVisual Studio Test Professional **0060P** \nMSDN Platforms **0062P** \nVisual Studio Enterprise **80063P**\nPay-As-You-Go Dev/Test **0023P** \nEnterprise Dev/Test **0148P** \n\n__Use : __\n\nType=AzureUsage_CL | Top 1 |select OfferDurableId_s\nto get the Azure Offer\n\n__Check More info on top for latest Azure Offer codes__\nSolition utilizes RateCard Api for the usage rates. Check : https://github.com/Azure/azure-content-nlnl/blob/master/articles/billing-countries-and-currencies.md to see supported currencies')]"
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "USAGE SUMMARY",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Spent by Subscription",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by AzureSubscription_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#ffb900",
+ "#009e49",
+ "#0072c6"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by AzureSubscription_s,meterCategory_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Usage-Currency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "SPEND by Service",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Spending - All Subscriptions",
+ "Subtitle": "Based on Hourly Usage and Azure Offer Selected"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by meterCategory_s ",
+ "CenterLegend": {
+ "Text": "Currency",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#009e49",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by meterCategory_s ",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Service",
+ "Value": "Cost"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "SPEND by Subscription",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "VM Deployment Cost Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureUsage_CL CostTag_s=Overall meterCategory_s=\"Virtual Machines\" |measure sum(Cost_d) as VMcost by AzureSubscription_s interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": "Cost Currency"
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Storage Consumption Cost Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall meterCategory_s=\"Storage\" |measure sum(Cost_d) by AzureSubscription_s interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": "Cost Currency"
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Data Management Cost Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall meterCategory_s=\"Data Management\" |measure sum(Cost_d) by AzureSubscription_s interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": "Cost Currency"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM CONSUMPTION COST",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VM Cost Over Time",
+ "Subtitle": "Based on Hourly Usage and Azure Offer Selected"
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall meterCategory_s=\"Virtual Machines\" |measure sum(Cost_d) by meterCategory_s interval 1HOUR",
+ "Callout": {
+ "Title": "Total",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall meterCategory_s=\"Virtual Machines\" | measure sum(Cost_d) by Resource",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Deployment",
+ "Value": "Cost Currency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Consumption Cost",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Consumption Cost Over Time",
+ "Subtitle": "Based on Hourly Usage and Azure Offer Selected"
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall meterCategory_s=\"Storage\" |measure sum(Cost_d) by meterCategory_s Interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall meterCategory_s=\"Storage\" |measure sum(Cost_d) by Resource",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "Cost Currency"
+ },
+ "Color": "#009e49",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "COST BY Tag",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Estimated Cost by Resource Tags",
+ "Subtitle": "Based on Daily Billing and Azure Offer Selected"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL | measure sum(TaggedCost_d) by Tag_s",
+ "CenterLegend": {
+ "Text": "Cost Currency",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#55d455",
+ "#ff8c00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL | measure sum(TaggedCost_d) by Tag_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Tag",
+ "Value": "Cost in Currency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Cost BY RESOURCEGROUP",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Estimated Cost By Resource Group",
+ "Subtitle": "Based on Daily Usage and Azure Offer Selected"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by ResourceGroup",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by AzureSubscription_s,ResourceGroup",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "ResourceGroup",
+ "Value": "Count"
+ },
+ "Color": "#009e49",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top Resources ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Cost by Resource",
+ "Subtitle": "All costs ( Network,Storage,Data) Associated with specific resource"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by Resource",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": " Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by Resource",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Resource ",
+ "Value": "Total Cost"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "SingleQueryDonutBuilderTileV1",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall | measure sum(Cost_d) by meterCategory_s ",
+ "CenterLegend": {
+ "Text": "Total Currency",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#009e49",
+ "#ff8c00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "name": "GEN-UNIQUE-30",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "AzureUsage-OPSINSIGHTS_WS_ID",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "AzureUsage-OPSINSIGHTS_WS_KEY",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureUsage-AzureAutomationAccount-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"GEN-UNIQUE-30\""
+ }
+ },
+ {
+ "name": "AzureUsage-AzureAutomationResourceGroup-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestParentRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestParentRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestParentRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestParentRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/ingestscheduleNameHourly-2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Ingestion API Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/schedules/ingestscheduleNameHourly-2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleNameHourly-2c84767f-feaf-47b1-9bc0-e9280ec740b1"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "type": "Microsoft.Automation/automationAccounts/jobs",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestParentRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "runbook": {
+ "name": "(runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "Currency": "Currency",
+ "Locale": "Locale",
+ "RegionInfo": "RegionInfo",
+ "OfferDurableId": "OfferDurableId",
+ "propagatetags": "1",
+ "syncInterval": "Hourly",
+ "clearLocks": "1"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestParentRunbook.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.name",
+ "Microsoft.Automation/automationAccounts/runbooks//GEN-UNIQUE-30/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks//GEN-UNIQUE-30/(runbooks).ingestParentRunbook.name",
+ "Microsoft.Automation/automationAccounts/variables//GEN-UNIQUE-30/AzureUsage-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/variables//GEN-UNIQUE-30/AzureUsage-OPSINSIGHTS_WS_KEY",
+ "Microsoft.Automation/automationAccounts/variables//GEN-UNIQUE-30/AzureUsage-AzureAutomationAccount-MS-Mgmt",
+ "Microsoft.Automation/automationAccounts/variables//GEN-UNIQUE-30/AzureUsage-AzureAutomationResourceGroup-MS-Mgmt"
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT75 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT75
new file mode 100644
index 0000000..1b0fe79
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT75
@@ -0,0 +1,643 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885465,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT75",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT75",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Admin user name for the VMs"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password for the VMs (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "cmUsername": {
+ "type": "string",
+ "defaultValue": "cmadmin",
+ "metadata": {
+ "description": "User name for the Cloudera Manager"
+ }
+ },
+ "cmPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "password for the Cloudera Manager (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS name where the VMs will be exposed"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "masterStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for master nodes (defaults to Premium_LRS)"
+ },
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for worker nodes (defaults to Standard_LRS)"
+ },
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "clouderavnet",
+ "metadata": {
+ "description": "The name of the virtual network provisioned for the deployment"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "vnetNewOrExisting": {
+ "type": "string",
+ "defaultValue": "new",
+ "allowedValues": [
+ "new",
+ "existing"
+ ],
+ "metadata": {
+ "description": "Indicator for new or exiting Virtual Network"
+ }
+ },
+ "virtualNetworkRGName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Resource Group Name for Vnet. For new VNet leave it empty, otherwise type in existing resource group name"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "clouderasubnet",
+ "metadata": {
+ "description": "Subnet name for the virtual network where resources will be provisioned"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "Virtual Network address CIDR"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "CIDR for the subnet where VMs will be placed"
+ }
+ },
+ "masterNodeIPAddress": {
+ "type": "string",
+ "defaultValue": "10.3.0.4",
+ "metadata": {
+ "description": "IP address for the first master"
+ }
+ },
+ "dataNodeIPOffSetFromMaster": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "IP address from the master node, for example if the first master is 10.1.1.1, then the first dataNode would be 10.1.1.11"
+ }
+ },
+ "tshirtSize": {
+ "type": "string",
+ "defaultValue": "Eval",
+ "allowedValues": [
+ "Eval",
+ "Prod"
+ ],
+ "metadata": {
+ "description": "T-shirt size of the Cloudera cluster (Eval, Prod)"
+ },
+ "value": "Eval"
+ },
+ "numberOfDataNodes": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Number of data nodes for Prod (defaults to 3)"
+ },
+ "value": 3
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D16s_v3",
+ "metadata": {
+ "description": "The size of the VMs deployed in the cluster (defaults to Standard_DS14)"
+ },
+ "allowedValues": [
+ "Standard_D16s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D8s_v3"
+ ],
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "type": "string",
+ "defaultValue": "ClouderaCentOS6_7",
+ "metadata": {
+ "description": "The OS VM Image (defaults to ClouderaCentOS6_7)"
+ },
+ "allowedValues": [
+ "ClouderaCentOS6_7",
+ "ClouderaCentOS6_8"
+ ],
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "type": "string",
+ "defaultValue": "Company",
+ "metadata": {
+ "description": "Your Company"
+ },
+ "value": "company"
+ },
+ "emailAddress": {
+ "type": "string",
+ "defaultValue": "email@yourcompany.com",
+ "metadata": {
+ "description": "your email"
+ },
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "type": "string",
+ "defaultValue": "123456789",
+ "metadata": {
+ "description": "your business phone number"
+ },
+ "value": "123456789"
+ },
+ "firstName": {
+ "type": "string",
+ "defaultValue": "FirstName",
+ "metadata": {
+ "description": "Your FirstName"
+ },
+ "value": "FirstName"
+ },
+ "lastName": {
+ "type": "string",
+ "defaultValue": "LastName",
+ "metadata": {
+ "description": "Your LastName"
+ },
+ "value": "LastName"
+ },
+ "jobRole": {
+ "type": "string",
+ "defaultValue": "Administrator",
+ "metadata": {
+ "description": "Job Role"
+ },
+ "allowedValues": [
+ "Administrator",
+ "Analyst (Industry/Finance)",
+ "Analyst (Technical)",
+ "Architect",
+ "C level",
+ "Consultant",
+ "Developer",
+ "Director",
+ "Engineer",
+ "Individual contributor",
+ "Manager",
+ "Partner",
+ "Student",
+ "VP"
+ ],
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "type": "string",
+ "defaultValue": "Analytics / Business Intelligence",
+ "metadata": {
+ "description": "Job Function"
+ },
+ "allowedValues": [
+ "Analytics / Business Intelligence",
+ "Big Data / Architecture",
+ "Data Warehouse / Management",
+ "Data Science",
+ "Database",
+ "ETL / ELT",
+ "Infrastructure",
+ "IT",
+ "Marketing / Sales",
+ "Networking",
+ "Manager",
+ "Security / Compliance",
+ "Storage"
+ ],
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "templateAPIVersion": "2015-11-01",
+ "resourceAPIVersion": "2015-06-15",
+ "installCDH": "True",
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "scriptsUriDescription": "For Command Line Deployment, scriptsUri must point to an Azure-accessible location like: https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos",
+ "scriptsUri": "[uri(deployment().properties.templateLink.uri, '.')]",
+ "share-resourcesUri": "[uri(deployment().properties.templateLink.uri, '.')]/shared-resources-new-vnet.json",
+ "data-nodeUri": "[concat(variables('scriptsUri'), '/data-node-', toLower(subString(parameters('vmSize'), 0, 13)), '.json')]",
+ "sa": "10.3.0.4",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterStorageAccount": {
+ "type": "Premium_LRS"
+ },
+ "workerStorageAccount": {
+ "type": "Standard_LRS"
+ },
+ "clusterTshirtSizeEval": {
+ "masterNodeCount": 1,
+ "dataNodeCount": 3,
+ "highAvailability": "false"
+ },
+ "clusterTshirtSizeProd": {
+ "masterNodeCount": 3,
+ "dataNodeCount": 3,
+ "highAvailability": "true"
+ },
+ "clusterSpec": "concat(clusterTshirtSize, parameters(tshirtSize))",
+ "vmImageInfo": {
+ "ClouderaCentOS6_7": {
+ "plan": {
+ "name": "cloudera-centos-6",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-6"
+ },
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-6",
+ "sku": "cloudera-centos-6",
+ "version": "latest"
+ }
+ },
+ "ClouderaCentOS6_8": {
+ "plan": {
+ "name": "6_8",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-os"
+ },
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-os",
+ "sku": "6_8",
+ "version": "latest"
+ }
+ },
+ "ClouderaCentOS6_7Germany": {
+ "plan": null,
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-os",
+ "sku": "6_7",
+ "version": "latest"
+ }
+ }
+ },
+ "vmSpec": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ },
+ "networkSpec": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ },
+ "newVNetId": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "existingVNetId": "parameters('virtualNetworkRGName')/Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "VNetId": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resources": [
+ {
+ "name": "shared-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/shared-resources-new-vnet.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "masterNodeASName": {
+ "value": "(vmSpec).masterNodeASName"
+ },
+ "dataNodeASName": {
+ "value": "(vmSpec).dataNodeASName"
+ }
+ }
+ }
+ },
+ {
+ "name": "master-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/master-node.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "storageAccount": {
+ "value": {
+ "type": "Premium_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).masterNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "data-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('data-nodeUri')]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "templateAPIVersion": {
+ "value": "2015-11-01"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "storageAccount": {
+ "value": {
+ "type": "Standard_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).dataNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "setup-cloudera",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/data-node",
+ "Microsoft.Resources/deployments/master-node"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/setup-cloudera.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "fqdn": {
+ "value": "[reference('master-node').outputs.fqdn.value]"
+ },
+ "cmUsername": {
+ "value": "cmadmin"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "company": {
+ "value": "Company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ },
+ "installCDH": {
+ "value": "True"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT750 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT750
new file mode 100644
index 0000000..6c636a8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT750
@@ -0,0 +1,711 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-resource-usage-solution/azuredeployonlyautomation.json",
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900672,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-resource-usage-solution/azuredeployonlyautomation.json",
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT750",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT750",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceId": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specify the Log Analytics workspace Id where Azure VM Inventory solution is deployed"
+ }
+ },
+ "omsWorkspaceKey": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specify the Log Analytics workspace key where Azure VM Inventory solution is deployed"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ },
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ },
+ "value": "eastus2"
+ },
+ "omsAutomationSku": {
+ "type": "string",
+ "defaultValue": "basic",
+ "allowedValues": [
+ "free",
+ "basic"
+ ],
+ "metadata": {
+ "description": "Specify the SKU for Automation Account"
+ }
+ },
+ "omsDataIngestionFrequency": {
+ "type": "string",
+ "defaultValue": "Hourly",
+ "allowedValues": [
+ "Hourly",
+ "Daily"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Usage data retrieval frequency"
+ },
+ "value": "Hourly"
+ },
+ "currency": {
+ "type": "string",
+ "defaultValue": "USD",
+ "allowedValues": [
+ "ARS",
+ "AUD",
+ "BRL",
+ "CAD",
+ "CHF",
+ "DKK",
+ "EUR",
+ "GBP",
+ "HKD",
+ "IDR",
+ "INR",
+ "JPY",
+ "KRW",
+ "MXN",
+ "MYR",
+ "NOK",
+ "NZD",
+ "RUB",
+ "SAR",
+ "SEK",
+ "TRY",
+ "TWD",
+ "USD",
+ "ZAR"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Billing Currency"
+ },
+ "value": "USD"
+ },
+ "regionInfo": {
+ "type": "string",
+ "defaultValue": "United States",
+ "allowedValues": [
+ "Afghanistan",
+ "Albania",
+ "Algeria",
+ "Angola",
+ "Argentina",
+ "Armenia",
+ "Australia",
+ "Austria",
+ "Azerbaijan",
+ "Bahamas",
+ "Bahrain",
+ "Bangladesh",
+ "Barbados",
+ "Belarus",
+ "Belgium",
+ "Belize",
+ "Bermuda",
+ "Bolivia",
+ "Bosnia and Herzegovina",
+ "Botswana",
+ "Brazil",
+ "Brunei",
+ "Bulgaria",
+ "Cameroon",
+ "Canada",
+ "Cape Verde",
+ "Cayman Islands",
+ "Chile",
+ "Colombia",
+ "Costa Rica",
+ "C\ufffdte d\ufffdIvoire",
+ "Croatia",
+ "Cura\ufffdao",
+ "Cyprus",
+ "Czech Republic",
+ "Denmark",
+ "Dominican Republic",
+ "Ecuador",
+ "Egypt",
+ "El Salvador",
+ "Estonia",
+ "Ethiopia",
+ "Faroe Islands",
+ "Fiji",
+ "Finland",
+ "France",
+ "Georgia",
+ "Germany",
+ "Ghana",
+ "Greece",
+ "Guatemala",
+ "Honduras",
+ "Hong Kong SAR",
+ "Hungary",
+ "Iceland",
+ "India",
+ "Indonesia",
+ "Iraq",
+ "Ireland",
+ "Israel",
+ "Italy",
+ "Jamaica",
+ "Japan",
+ "Jordan",
+ "Kazakhstan",
+ "Kenya",
+ "Korea",
+ "Kuwait",
+ "Kyrgyzstan",
+ "Latvia",
+ "Lebanon",
+ "Libya",
+ "Liechtenstein",
+ "Lithuania",
+ "Luxembourg",
+ "Macao SAR",
+ "Macedonia, FYRO",
+ "Malaysia",
+ "Malta",
+ "Mauritius",
+ "Mexico",
+ "Moldova",
+ "Monaco",
+ "Mongolia",
+ "Montenegro",
+ "Morocco",
+ "Namibia",
+ "Nepal",
+ "Netherlands",
+ "New Zealand",
+ "Nicaragua",
+ "Nigeria",
+ "Norway",
+ "Oman",
+ "Pakistan",
+ "Palestinian Territory",
+ "Panama",
+ "Paraguay",
+ "Peru",
+ "Philippines",
+ "Poland",
+ "Portugal",
+ "Puerto Rico",
+ "Qatar",
+ "Romania",
+ "Russia",
+ "Rwanda",
+ "Saint Kitts and Nevis",
+ "Saudi Arabia",
+ "Senegal",
+ "Serbia",
+ "Singapore",
+ "Slovakia",
+ "Slovenia",
+ "South Africa",
+ "Spain",
+ "Sri Lanka",
+ "Sweden",
+ "Switzerland",
+ "Taiwan",
+ "Tajikistan",
+ "Tanzania",
+ "Thailand",
+ "Trinidad and Tobago",
+ "Tunisia",
+ "Turkey",
+ "Turkmenistan",
+ "U.S. Virgin Islands",
+ "Uganda",
+ "Ukraine",
+ "United Arab Emirates",
+ "United Kingdom",
+ "United States",
+ "Uruguay",
+ "Uzbekistan",
+ "Venezuela",
+ "Vietnam",
+ "Yemen",
+ "Zambia",
+ "Zimbabwe"
+ ],
+ "metadata": {
+ "description": "Specify region for Azure BillingSee https://github.com/Azure/azure-content-nlnl/blob/master/articles/billing-countries-and-currencies.md for details."
+ },
+ "value": "United States"
+ },
+ "locale": {
+ "type": "string",
+ "defaultValue": "en-US",
+ "allowedValues": [
+ "en-AU",
+ "ar-AE",
+ "ar-BH",
+ "ar-DZ",
+ "ar-IQ",
+ "ar-JO",
+ "ar-KW",
+ "ar-LB",
+ "ar-LY",
+ "ar-MA",
+ "ar-OM",
+ "ar-QA",
+ "ar-SA",
+ "ar-TN",
+ "ar-YE",
+ "bg-BG",
+ "ca-ES",
+ "cs-CZ",
+ "da-DK",
+ "de-AT",
+ "de-CH",
+ "de-DE",
+ "de-LI",
+ "de-LU",
+ "el-CY",
+ "el-GR",
+ "en-AE",
+ "en-BZ",
+ "en-CA",
+ "en-DZ",
+ "en-GB",
+ "en-HK",
+ "en-IE",
+ "en-IN",
+ "en-JM",
+ "en-JO",
+ "en-KE",
+ "en-MT",
+ "en-MY",
+ "en-NG",
+ "en-NZ",
+ "en-PH",
+ "en-SG",
+ "en-SI",
+ "en-SK",
+ "en-TH",
+ "en-TT",
+ "en-US",
+ "en-ZA",
+ "en-ZW",
+ "es-AR",
+ "es-BO",
+ "es-CL",
+ "es-CO",
+ "es-CR",
+ "es-DO",
+ "es-EC",
+ "es-ES",
+ "es-GT",
+ "es-HN",
+ "es-MX",
+ "es-NI",
+ "es-PA",
+ "es-PE",
+ "es-PR",
+ "es-PY",
+ "es-SV",
+ "es-US",
+ "es-UY",
+ "es-VE",
+ "et-EE",
+ "eu-ES",
+ "fi-FI",
+ "fr-BE",
+ "fr-CA",
+ "fr-CH",
+ "fr-DZ",
+ "fr-FR",
+ "fr-LU",
+ "fr-MA",
+ "fr-MC",
+ "fr-SN",
+ "fr-TN",
+ "gl-ES",
+ "he-IL",
+ "hi-IN",
+ "hr-HR",
+ "hu-HU",
+ "id-ID",
+ "it-CH",
+ "it-IT",
+ "ja-JP",
+ "kk-KZ",
+ "ko-KR",
+ "lt-LT",
+ "lv-LV",
+ "ms-BN",
+ "ms-MY",
+ "nb-NO",
+ "nl-BE",
+ "nl-NL",
+ "pl-PL",
+ "pt-BR",
+ "pt-PT",
+ "ro-RO",
+ "ru-BY",
+ "ru-KZ",
+ "ru-RU",
+ "ru-UA",
+ "sk-SK",
+ "sl-SI",
+ "sr-Cyrl-RS",
+ "sr-Latn-ME",
+ "sr-Latn-RS",
+ "sv-FI",
+ "sv-SE",
+ "th-TH",
+ "tr-TR",
+ "uk-UA",
+ "vi-VN",
+ "zh-CN",
+ "zh-HK",
+ "zh-MO",
+ "zh-SG",
+ "zh-TW"
+ ],
+ "metadata": {
+ "description": "Specify locale for Azure Billing. See https://github.com/Azure/azure-content-nlnl/blob/master/articles/billing-countries-and-currencies.md for details."
+ },
+ "value": "en-US"
+ },
+ "offerDurableId": {
+ "type": "string",
+ "allowedValues": [
+ "MS-AZR-0003P : Pay-As-You-Go",
+ "MS-AZR-0041P : Support Plans",
+ "MS-AZR-0042P : Support Plans",
+ "MS-AZR-0043P : Support Plans",
+ "MS-AZR-0044P : Free Trial",
+ "MS-AZR-0059P : Visual Studio Professional subscribers",
+ "MS-AZR-0060P : Visual Studio Test Professional subscribers",
+ "MS-AZR-0062P : MSDN Platforms subscribers",
+ "MS-AZR-0063P : Visual Studio Enterprise subscribers",
+ "MS-AZR-0064P : Visual Studio Enterprise (BizSpark) subscribers",
+ "MS-AZR-0029P : Visual Studio Enterprise (MPN) subscribers",
+ "MS-AZR-0022P : Visual Studio Dev Essentials members",
+ "MS-AZR-0023P : Pay-As-You-Go Dev/Test",
+ "MS-AZR-0148P : Enterprise Dev/Test",
+ "MS-AZR-0025P : Action Pack",
+ "MS-AZR-0036P : Microsoft Azure Sponsored Offer",
+ "MS-AZR-0120P : Azure Pass",
+ "MS-AZR-0130P : Azure Pass",
+ "MS-AZR-0111p : Azure in Open Licensing",
+ "MS-AZR-0144P : Microsoft Imagine",
+ "MS-AZR-0149P : BizSpark Plus",
+ "MS-AZR-0145P : Azure in CSP",
+ "MS-AZR-DE-0145P : Azure Germany in CSP for Microsoft Cloud Germany",
+ "MS-AZR-0044P : Azure Germany Free Trial",
+ "MS-AZR-DE-0003P : Azure Germany Pay-As-You-Go",
+ "MS-AZR-DE-0041P : Azure Germany Support Plans",
+ "MS-AZR-DE-0042P : Azure Germany Support Plans",
+ "MS-AZR-DE-0043P : Azure Germany Support Plans",
+ "MS-AZR-0051p : Azure NotInUse"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Offer ID available in subscription details from Azure Portal"
+ },
+ "value": "MS-AZR-0003P : Pay-As-You-Go"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ },
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "ingestSchedulerGuid": {
+ "type": "string",
+ "defaultValue": "53c6dea7-806f-4598-9ec9-a35ca2732b54",
+ "metadata": {
+ "description": "GUID for the schedule creation - create a unique before deploy"
+ },
+ "value": "2c84767f-feaf-47b1-9bc0-e9280ec740b1"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "standalone"
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestParentRunbook": {
+ "name": "AzureUsage-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Usage data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureUsage-Schedules-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "parentRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "opsInsightWorkspaceID": "AzureUsage-OPSINSIGHTS_WS_ID",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureUsage-OPSINSIGHTS_WS_KEY",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureUsage-AzureAutomationAccount-MS-Mgmt",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureUsage-AzureAutomationResourceGroup-MS-Mgmt",
+ "createScheduleResourceGroupType": "string",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "ingestScheduleName": "AzureUsage-Scheduler-",
+ "propagatetags": "1"
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "name": "GEN-UNIQUE-30",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "AzureUsage-OPSINSIGHTS_WS_ID",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"parameters('omsWorkspaceId')\""
+ }
+ },
+ {
+ "name": "(opsInsightWorkspaceKey)",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "\"parameters('omsWorkspaceKey')\""
+ }
+ },
+ {
+ "name": "AzureUsage-AzureAutomationAccount-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"GEN-UNIQUE-30\""
+ }
+ },
+ {
+ "name": "AzureUsage-AzureAutomationResourceGroup-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestParentRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestParentRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestParentRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestParentRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureUsage-OPSINSIGHTS_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureUsage-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/ingestscheduleName-2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Ingestion API Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/schedules/ingestscheduleName-2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleName-2c84767f-feaf-47b1-9bc0-e9280ec740b1"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/2c84767f-feaf-47b1-9bc0-e9280ec740b1",
+ "type": "Microsoft.Automation/automationAccounts/jobs",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestParentRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "runbook": {
+ "name": "(runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "Currency": "Currency",
+ "Locale": "Locale",
+ "RegionInfo": "RegionInfo",
+ "OfferDurableId": "OfferDurableId",
+ "propagatetags": "1",
+ "syncInterval": "Hourly",
+ "clearLocks": "1"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT751 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT751
new file mode 100644
index 0000000..31dac62
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT751
@@ -0,0 +1,837 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-resource-usage-solution/azuredeployonlyloganalytics.json",
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900682,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-resource-usage-solution/azuredeployonlyloganalytics.json",
+ "/demos/oms-azure-resource-usage-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT751",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT751",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "wescentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ },
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the SKU for Log Analytics"
+ },
+ "value": "standalone"
+ },
+ "omsDataIngestionFrequency": {
+ "type": "string",
+ "defaultValue": "Hourly",
+ "allowedValues": [
+ "Hourly",
+ "Daily"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Usage data retrieval frequency"
+ },
+ "value": "Hourly"
+ },
+ "currency": {
+ "type": "string",
+ "defaultValue": "USD",
+ "allowedValues": [
+ "ARS",
+ "AUD",
+ "BRL",
+ "CAD",
+ "CHF",
+ "DKK",
+ "EUR",
+ "GBP",
+ "HKD",
+ "IDR",
+ "INR",
+ "JPY",
+ "KRW",
+ "MXN",
+ "MYR",
+ "NOK",
+ "NZD",
+ "RUB",
+ "SAR",
+ "SEK",
+ "TRY",
+ "TWD",
+ "USD",
+ "ZAR"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Billing Currency"
+ },
+ "value": "USD"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-resource-usage-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ },
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "omsAutomationAccountName": {
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "value": "eastus2"
+ },
+ "regionInfo": {
+ "value": "United States"
+ },
+ "locale": {
+ "value": "en-US"
+ },
+ "offerDurableId": {
+ "value": "MS-AZR-0003P : Pay-As-You-Go"
+ },
+ "ingestSchedulerGuid": {
+ "value": "2c84767f-feaf-47b1-9bc0-e9280ec740b1"
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure Usage",
+ "solutionName": "[concat('AzureUsage', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Usage",
+ "description": "Monitor Azure Usage",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureUsage-OPSINSIGHTS_WS_ID",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureUsage-OPSINSIGHTS_WS_KEY",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureUsage-AzureAutomationAccount-MS-Mgmt",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureUsage-AzureAutomationResourceGroup-MS-Mgmt",
+ "createScheduleResourceGroupType": "string",
+ "createScheduleResourceGroupDescription": "The name of the resource group"
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-20",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "properties": {
+ "sku": {
+ "name": "standalone"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "dependsOn": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "DisplayName": "(omsSolutions).customSolution.displayName",
+ "Description": "(omsSolutions).customSolution.description",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Azure Offer Types",
+ "Link": {
+ "Label": "More info",
+ "Url": "https://azure.microsoft.com/en-us/support/legal/offer-details/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Here Are the Common Azure Offers",
+ "Content": "[concat('Pay-As-You-Go **0003P** \nAzure Dynamics **0033P** \nFree Trial **0044P** \nVisual Studio Professional **0059P** \nVisual Studio Test Professional **0060P** \nMSDN Platforms **0062P** \nVisual Studio Enterprise **80063P**\nPay-As-You-Go Dev/Test **0023P** \nEnterprise Dev/Test **0148P** \n\n__Use : __\n\nType=AzureUsage_CL | Top 1 |select OfferDurableId_s\nto get the Azure Offer\n\n__Check More info on top for latest Azure Offer codes__\nSolition utilizes RateCard Api for the usage rates. Check : https://github.com/Azure/azure-content-nlnl/blob/master/articles/billing-countries-and-currencies.md to see supported currencies')]"
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "USAGE SUMMARY",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Spent by Subscription",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly | measure sum(Cost_d) by AzureSubscription_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#ffb900",
+ "#009e49",
+ "#0072c6"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly | measure sum(Cost_d) by AzureSubscription_s,meterCategory_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Usage-Currency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "SPEND by Service",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Spending - All Subscriptions",
+ "Subtitle": "Based on Hourly Usage and Azure Offer Selected"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly | measure sum(Cost_d) by meterCategory_s ",
+ "CenterLegend": {
+ "Text": "Currency",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#009e49",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly | measure sum(Cost_d) by meterCategory_s ",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Service",
+ "Value": "Cost"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "SPEND by Subscription",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "VM Deployment Cost Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly meterCategory_s=\"Virtual Machines\" |measure sum(Cost_d) as VMcost by AzureSubscription_s interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": "Cost Currency"
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Storage Consumption Cost Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly meterCategory_s=\"Storage\" |measure sum(Cost_d) by AzureSubscription_s interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": "Cost Currency"
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Data Management Cost Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly meterCategory_s=\"Data Management\" |measure sum(Cost_d) by AzureSubscription_s interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": "Cost Currency"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM CONSUMPTION COST",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VM Cost Over Time",
+ "Subtitle": "Based on Hourly Usage and Azure Offer Selected"
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly meterCategory_s=\"Virtual Machines\" |measure sum(Cost_d) by meterCategory_s interval 1HOUR",
+ "Callout": {
+ "Title": "Total",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly meterCategory_s=\"Virtual Machines\" | measure sum(Cost_d) by Resource",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Deployment",
+ "Value": "Cost Currency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Consumption Cost",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Consumption Cost Over Time",
+ "Subtitle": "Based on Hourly Usage and Azure Offer Selected"
+ },
+ "LineChart": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly meterCategory_s=\"Storage\" |measure sum(Cost_d) by meterCategory_s Interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly meterCategory_s=\"Storage\" |measure sum(Cost_d) by Resource",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "Cost Currency"
+ },
+ "Color": "#009e49",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "COST BY Tag",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Estimated Cost by Resource Tags",
+ "Subtitle": "Based on Daily Billing and Azure Offer Selected"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL | measure sum(TaggedCost_d) by Tag_s",
+ "CenterLegend": {
+ "Text": "Cost Currency",
+ "Operation": "Sum",
+ "ArcsToSelect": [
+ "Overall"
+ ]
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#55d455",
+ "#ff8c00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL | measure sum(TaggedCost_d) by Tag_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Tag",
+ "Value": "Cost in Currency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Cost BY RESOURCEGROUP",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Estimated Cost By Resource Group",
+ "Subtitle": "Based on Daily Usage and Azure Offer Selected"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly| measure sum(Cost_d) by ResourceGroup",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly| measure sum(Cost_d) by AzureSubscription_s,ResourceGroup",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "ResourceGroup",
+ "Value": "Count"
+ },
+ "Color": "#009e49",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Top Resources ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Cost by Resource",
+ "Subtitle": "All costs ( Network,Storage,Data) Associated with specific resource"
+ },
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly| measure sum(Cost_d) by Resource",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": " Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly| measure sum(Cost_d) by Resource",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Resource ",
+ "Value": "Total Cost"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "SingleQueryDonutBuilderTileV1",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "Donut": {
+ "Query": "* Type=AzureUsage_CL CostTag_s=Overall Aggregation_s=Hourly | measure sum(Cost_d) by meterCategory_s ",
+ "CenterLegend": {
+ "Text": "Total Currency",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#009e49",
+ "#ff8c00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT752 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT752
new file mode 100644
index 0000000..6624f71
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT752
@@ -0,0 +1,3182 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToLinkedWorkspaceAnalyticsOnly.json"
+ ],
+ "timestamp": 1642962900693,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToLinkedWorkspaceAnalyticsOnly.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT752",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules",
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules/actions",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/linkedservices",
+ "microsoft.operationalinsights/workspaces/savedsearches",
+ "microsoft.automation/automationaccounts",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT752",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "deploymentNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Used to create unique deployment names for subsequent deployments"
+ }
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ }
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "westcentralus",
+ "japaneast",
+ "uksouth",
+ "centralindia",
+ "canadacentral"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ }
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast",
+ "northcentralus",
+ "brazilsouth",
+ "uksouth",
+ "westcentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "linkedWorkspaceSKU": {
+ "type": "array",
+ "defaultValue": [
+ "pernode",
+ "OMS"
+ ],
+ "allowedValues": [
+ [
+ "pernode",
+ "OMS"
+ ],
+ [
+ "free",
+ "free"
+ ]
+ ]
+ },
+ "collectAuditLogs": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "This option creates extra collectors to collect and ingest storage audit logs"
+ }
+ },
+ "collectionFromAllSubscriptions": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Enables data collection from all subscriptions where Azure SPN has access"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestMetricsRunbook": {
+ "name": "AzureSAIngestionMetrics-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Inventory data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestLogsRunbook": {
+ "name": "AzureSAIngestionLogs-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Audit Logs into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestMetricsEnablerRunbook": {
+ "name": "AzureSAMetricsEnabler-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to enable Storage Analytics metrics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureSACreateSchedules-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "ingestScheduleGuid": "[guid(uniqueString(resourceGroup().id, deployment().name))]",
+ "metricsRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "logsRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAIngestionLogs-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "metricsEnablerRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "azureSubscriptionId": "saAzureSubscriptionId",
+ "omsSolutions": {
+ "customSolution1": {
+ "name": "Azure Storage Analytics",
+ "solutionName": "[concat('AzureStorageAnalytics', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Storage Analytics",
+ "description": "Monitor and analyze Azure Storage Accounts",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "createScheduleResourceGroupType": "string",
+ "SchedulerFrequency": "Hourly",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "ingestScheduleName": "AzureSA-Scheduler-Hourly",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "alertArray": [
+ {
+ "searchName": "Azure Storage Account IO Throttling Limit",
+ "description": "Each standard storage account is capped to 20.000 IOPs . This alert is indicator that one of your storage accounts is at the risk of throttling and IO might be capped.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile StorageAccount_s in {Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=StorageAccount Tier_s=Standard|measure count() by StorageAccount_s}| measure sum(MaxDiskIO_d) as TotalIO by StorageAccount_s |where TotalIO > 20000 ",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 15,
+ "scheduleQueryTimeSpan": 15,
+ "alertName": "Azure Storage Account IO Throttling Limits Reached"
+ },
+ {
+ "searchName": "Azure Premium Storage Account NotinUse",
+ "description": "Azure does not delete the vhd files associated with VMs when the VM is deleted. If the VM is suing premium storage you will be chardged for that storage untill you migarte the data and delete the storage account.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile Uri_s=NullUri TimeGenerated>NOW-1HOUR |measure count() by StorageAccount_s",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Premium Storage Account NotinUse"
+ }
+ ],
+ "alertMetricArray": [
+ {
+ "searchName": "Azure Storage Quota Usage Critical",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approaching the storage account limits.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 90,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 90%"
+ },
+ {
+ "searchName": "Azure Storage Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 80%"
+ },
+ {
+ "searchName": "Azure Storage Availability Below 95pct",
+ "description": "Any value less than 100% indicates that some storage requests are failing. Examine other ErrorPercentage information to see the reason for failures. This alert is an indicator that Availability for requests fall below %95.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 95,
+ "operator": "lt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Availability Below 95pct"
+ },
+ {
+ "searchName": "Azure Storage End2End Latency Too High",
+ "description": "AverageE2ELatency is a measure of end-to-end latency that includes the time taken to read the request and send the response in addition to the time taken to process the request including network latency. This alert is an indicator that AvergaeE2ELAtency for storage account is above 100ms.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 100,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage End2End Latency Above 100ms"
+ },
+ {
+ "searchName": "Azure Storage High PercentThrottlingError",
+ "description": "Throttling errors occur when you exceed the scalability targets of a storage service. The storage service does this to ensure that no single client or tenant can use the service at the expense of others. This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentThrottlingError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentThrottlingError"
+ },
+ {
+ "searchName": "Azure Storage High PercentTimeoutError",
+ "description": "The PercentTimeoutError metric represents the timeout in storage requests and is an aggregation of the following metrics: ClientTimeoutError, AnonymousClientTimeoutError, SASClientTimeoutError, ServerTimeoutError, AnonymousServerTimeoutError, and SASServerTimeoutError.This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentTimeoutError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentTimeoutError"
+ },
+ {
+ "searchName": "Azure Storage High PercentNetworkError",
+ "description": "The PercentNetworkError metric is an aggregation of the following metrics NetworkError, AnonymousNetworkError, and SASNetworkError. These occur when the storage service detects a network error when the client makes a storage request.This alert is an indicator that storage account is facing network related errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentNetworkError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentNetworkError"
+ },
+ {
+ "searchName": "Azure Storage SASAuthorizationError",
+ "description": "If the client application attempts to use a SAS key that does not include the necessary permissions for the operation, the storage service returns an HTTP 404 (Not found) message to the client. At the same time, you will also see a non-zero value for SASAuthorizationError in the metrics. This alert is an indicator that storage account is facing SAS Autorizations errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(SASAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage SASAuthorizationError Detected"
+ },
+ {
+ "searchName": "Azure Storage High PercentAuthorizationError",
+ "description": "The percentage of requests that failed with an AuthorizationError. This alert is an indicator that storage account is facing authorization errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentAuthorizationError"
+ },
+ {
+ "searchName": "Azure Storage PercentClientOtherError",
+ "description": "Authenticated request that failed as expected. This error can represent many 300-400 level HTTP status codes and conditions such as NotFound and ResourceAlreadyExists. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentClientOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentClientOtherError"
+ },
+ {
+ "searchName": "Azure Storage High PercentServerOtherError",
+ "description": "Authenticated request that failed due to unknown server errors, most commonly returning an HTTP 500 status code. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentServerOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentServerOtherError"
+ },
+ {
+ "searchName": "Azure File Share Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL InventoryType_s=File | EXTEND product(div(ShareUsedGB_d,Quota_d),100) as ShareUsage | measure avg(ShareUsage) by FileShare_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure File Share Quota Usage is greater than 80%"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "properties": {
+ "sku": {
+ "name": "[first(parameters('linkedWorkspaceSKU'))]"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution1.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "dependson": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution1.name",
+ "DisplayName": "(omsSolutions).customSolution1.displayName",
+ "Description": "(omsSolutions).customSolution1.description",
+ "Author": "(omsSolutions).customSolution1.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "Azure Storage Analytics",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Azure Storage Account Monitoring",
+ "Link": {
+ "Label": "More info ",
+ "Url": "https://github.com/Azure/azure-quickstart-templates/blob/master/demos/oms-azure-storage-analytics-solution/README.md"
+ }
+ },
+ "List": [
+ {
+ "Title": "Solution Overview",
+ "Content": "\nAzure Storage Analytics Solution utilizes native **Storage REST API** capabilities and **Storage Analytics** to enable inventory of storage accounts , capacity and transaction monitoring and collecting storage audit logs from a single or multiple Azure Subscriptions. \nCollected data can be utilized to create alerts and trigger automation runbooks.\n\n Inventory and metrics are collected every 15 mins, logs are collected every 60 mins and VHD blob scan is performed every 4hours."
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Usage for Subscription",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Accounts by Deployment type",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(SACurrent_d) by QuotaType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#55d455",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account Quota",
+ "Value": "% Utilized"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "80",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Azure Storage Inventory",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Inventory",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": [
+ "StorageAccount"
+ ]
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Inventory",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Capacity Usage",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Utilized (GB)",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#fcd116",
+ "#0072c6",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE Account",
+ "Value": "UsedinGB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "400000",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "450000",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "STORAGE ACCOUNT INVENTORY",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "SA by Tier",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Sku_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Location_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA by Location",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "200",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "250",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Total Requests",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalRequests per Storage Acc",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#55d455",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - E2E Latency (ms)",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "Latency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "50",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "100",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "IAAS - Disks by SA",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VHDs Attached to VMs",
+ "Subtitle": "VHD Count"
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "VHD COUNT"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "35",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "40",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Throttling Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Throttling ErrorPct by Storage Service",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageService_s",
+ "Callout": {
+ "Title": "Avg per hour",
+ "Series": "",
+ "Operation": "Average"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": " Top 10 "
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "Count",
+ "baseUnit": "Ones",
+ "displayUnit": "AUTO"
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over Time",
+ "Subtitle": "TOP 10"
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Ingres Traffic",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Ingress Traffic"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Egress Traffic KB",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Egress Traffic KB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - TOTAL REQUESTS ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Request per Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File| measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "Callout": {
+ "Title": "TOTAL REQUESTS",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiversion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "name": "",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "[last(parameters('linkedWorkspaceSKU'))]"
+ }
+ },
+ "resources": [
+ {
+ "name": "saAzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "(opsInsightWorkspaceKey)",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "\" parameters('omsAutomationAccountName')\""
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsEnablerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsEnablerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsEnablerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsEnablerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/ingestscheduleName",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Azure Storage Runbook Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/IngestScheduleGuid",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/schedules/ingestscheduleName",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleName"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "collectAuditLogs": "collectAuditLogs",
+ "collectionFromAllSubscriptions": "collectionFromAllSubscriptions"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces/linkedServices",
+ "name": "parameters('omsLogAnalyticsWorkspaceName')/Automation",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "properties": {
+ "resourceId": "Microsoft.Automation/automationAccounts//parameters('omsAutomationAccountName')"
+ },
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')"
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "product": "(omsSolutions).customSolution1.name",
+ "publisher": "(omsSolutions).customSolution1.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces// parameters('omsLogAnalyticsWorkspaceName')",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsEnablerRunbook.name",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT753 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT753
new file mode 100644
index 0000000..deccfa6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT753
@@ -0,0 +1,3768 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToLinkedWorkspaceWithAuditLogs.json"
+ ],
+ "timestamp": 1642962900715,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToLinkedWorkspaceWithAuditLogs.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT753",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules",
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules/actions",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/linkedservices",
+ "microsoft.operationalinsights/workspaces/savedsearches",
+ "microsoft.automation/automationaccounts",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT753",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "deploymentNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Used to create unique deployment names for subsequent deployments"
+ }
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ }
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "westcentralus",
+ "japaneast",
+ "uksouth",
+ "centralindia",
+ "canadacentral"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ }
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast",
+ "northcentralus",
+ "brazilsouth",
+ "uksouth",
+ "westcentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "linkedWorkspaceSKU": {
+ "type": "array",
+ "defaultValue": [
+ "pernode",
+ "OMS"
+ ],
+ "allowedValues": [
+ [
+ "pernode",
+ "OMS"
+ ],
+ [
+ "free",
+ "free"
+ ]
+ ]
+ },
+ "collectAuditLogs": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "This option creates extra collectors to collect and ingest storage audit logs"
+ }
+ },
+ "collectionFromAllSubscriptions": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Enables data collection from all subscriptions where Azure SPN has access"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestMetricsRunbook": {
+ "name": "AzureSAIngestionMetrics-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Inventory data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestLogsRunbook": {
+ "name": "AzureSAIngestionLogs-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Audit Logs into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestMetricsEnablerRunbook": {
+ "name": "AzureSAMetricsEnabler-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to enable Storage Analytics metrics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureSACreateSchedules-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "ingestScheduleGuid": "[guid(uniqueString(resourceGroup().id, deployment().name))]",
+ "metricsRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "logsRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAIngestionLogs-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "metricsEnablerRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "azureSubscriptionId": "saAzureSubscriptionId",
+ "omsSolutions": {
+ "customSolution1": {
+ "name": "Azure Storage Analytics",
+ "solutionName": "[concat('AzureStorageAnalytics', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Storage Analytics",
+ "description": "Monitor and analyze Azure Storage Accounts",
+ "author": "volkanc@microsoft.com"
+ },
+ "customSolution2": {
+ "name": "Azure Storage Audit Logs",
+ "solutionName": "[concat('AzureStorageAuditLogs', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Storage Audit Logs",
+ "description": "Monitor and analyze Azure Storage Account Audit Logs",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "createScheduleResourceGroupType": "string",
+ "SchedulerFrequency": "Hourly",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "ingestScheduleName": "AzureSA-Scheduler-Hourly",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "alertArray": [
+ {
+ "searchName": "Azure Storage Account IO Throttling Limit",
+ "description": "Each standard storage account is capped to 20.000 IOPs . This alert is indicator that one of your storage accounts is at the risk of throttling and IO might be capped.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile StorageAccount_s in {Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=StorageAccount Tier_s=Standard|measure count() by StorageAccount_s}| measure sum(MaxDiskIO_d) as TotalIO by StorageAccount_s |where TotalIO > 20000 ",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 15,
+ "scheduleQueryTimeSpan": 15,
+ "alertName": "Azure Storage Account IO Throttling Limits Reached"
+ },
+ {
+ "searchName": "Azure Premium Storage Account NotinUse",
+ "description": "Azure does not delete the vhd files associated with VMs when the VM is deleted. If the VM is suing premium storage you will be chardged for that storage untill you migarte the data and delete the storage account.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile Uri_s=NullUri TimeGenerated>NOW-1HOUR |measure count() by StorageAccount_s",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Premium Storage Account NotinUse"
+ }
+ ],
+ "alertMetricArray": [
+ {
+ "searchName": "Azure Storage Quota Usage Critical",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approaching the storage account limits.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 90,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 90%"
+ },
+ {
+ "searchName": "Azure Storage Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 80%"
+ },
+ {
+ "searchName": "Azure Storage Availability Below 95pct",
+ "description": "Any value less than 100% indicates that some storage requests are failing. Examine other ErrorPercentage information to see the reason for failures. This alert is an indicator that Availability for requests fall below %95.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 95,
+ "operator": "lt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Availability Below 95pct"
+ },
+ {
+ "searchName": "Azure Storage End2End Latency Too High",
+ "description": "AverageE2ELatency is a measure of end-to-end latency that includes the time taken to read the request and send the response in addition to the time taken to process the request including network latency. This alert is an indicator that AvergaeE2ELAtency for storage account is above 100ms.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 100,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage End2End Latency Above 100ms"
+ },
+ {
+ "searchName": "Azure Storage High PercentThrottlingError",
+ "description": "Throttling errors occur when you exceed the scalability targets of a storage service. The storage service does this to ensure that no single client or tenant can use the service at the expense of others. This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentThrottlingError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentThrottlingError"
+ },
+ {
+ "searchName": "Azure Storage High PercentTimeoutError",
+ "description": "The PercentTimeoutError metric represents the timeout in storage requests and is an aggregation of the following metrics: ClientTimeoutError, AnonymousClientTimeoutError, SASClientTimeoutError, ServerTimeoutError, AnonymousServerTimeoutError, and SASServerTimeoutError.This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentTimeoutError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentTimeoutError"
+ },
+ {
+ "searchName": "Azure Storage High PercentNetworkError",
+ "description": "The PercentNetworkError metric is an aggregation of the following metrics NetworkError, AnonymousNetworkError, and SASNetworkError. These occur when the storage service detects a network error when the client makes a storage request.This alert is an indicator that storage account is facing network related errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentNetworkError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentNetworkError"
+ },
+ {
+ "searchName": "Azure Storage SASAuthorizationError",
+ "description": "If the client application attempts to use a SAS key that does not include the necessary permissions for the operation, the storage service returns an HTTP 404 (Not found) message to the client. At the same time, you will also see a non-zero value for SASAuthorizationError in the metrics. This alert is an indicator that storage account is facing SAS Autorizations errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(SASAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage SASAuthorizationError Detected"
+ },
+ {
+ "searchName": "Azure Storage High PercentAuthorizationError",
+ "description": "The percentage of requests that failed with an AuthorizationError. This alert is an indicator that storage account is facing authorization errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentAuthorizationError"
+ },
+ {
+ "searchName": "Azure Storage PercentClientOtherError",
+ "description": "Authenticated request that failed as expected. This error can represent many 300-400 level HTTP status codes and conditions such as NotFound and ResourceAlreadyExists. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentClientOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentClientOtherError"
+ },
+ {
+ "searchName": "Azure Storage High PercentServerOtherError",
+ "description": "Authenticated request that failed due to unknown server errors, most commonly returning an HTTP 500 status code. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentServerOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentServerOtherError"
+ },
+ {
+ "searchName": "Azure File Share Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL InventoryType_s=File | EXTEND product(div(ShareUsedGB_d,Quota_d),100) as ShareUsage | measure avg(ShareUsage) by FileShare_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure File Share Quota Usage is greater than 80%"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "properties": {
+ "sku": {
+ "name": "[first(parameters('linkedWorkspaceSKU'))]"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution1.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "dependson": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution1.name",
+ "DisplayName": "(omsSolutions).customSolution1.displayName",
+ "Description": "(omsSolutions).customSolution1.description",
+ "Author": "(omsSolutions).customSolution1.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "Azure Storage Analytics",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Azure Storage Account Monitoring",
+ "Link": {
+ "Label": "More info ",
+ "Url": "https://github.com/Azure/azure-quickstart-templates/blob/master/demos/oms-azure-storage-analytics-solution/README.md"
+ }
+ },
+ "List": [
+ {
+ "Title": "Solution Overview",
+ "Content": "\nAzure Storage Analytics Solution utilizes native **Storage REST API** capabilities and **Storage Analytics** to enable inventory of storage accounts , capacity and transaction monitoring and collecting storage audit logs from a single or multiple Azure Subscriptions. \nCollected data can be utilized to create alerts and trigger automation runbooks.\n\n Inventory and metrics are collected every 15 mins, logs are collected every 60 mins and VHD blob scan is performed every 4hours."
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Usage for Subscription",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Accounts by Deployment type",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(SACurrent_d) by QuotaType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#55d455",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account Quota",
+ "Value": "% Utilized"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "80",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Azure Storage Inventory",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Inventory",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": [
+ "StorageAccount"
+ ]
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Inventory",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Capacity Usage",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Utilized (GB)",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#fcd116",
+ "#0072c6",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE Account",
+ "Value": "UsedinGB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "400000",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "450000",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "STORAGE ACCOUNT INVENTORY",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "SA by Tier",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Sku_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Location_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA by Location",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "200",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "250",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Total Requests",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalRequests per Storage Acc",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#55d455",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - E2E Latency (ms)",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "Latency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "50",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "100",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "IAAS - Disks by SA",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VHDs Attached to VMs",
+ "Subtitle": "VHD Count"
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "VHD COUNT"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "35",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "40",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Throttling Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Throttling ErrorPct by Storage Service",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageService_s",
+ "Callout": {
+ "Title": "Avg per hour",
+ "Series": "",
+ "Operation": "Average"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": " Top 10 "
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "Count",
+ "baseUnit": "Ones",
+ "displayUnit": "AUTO"
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over Time",
+ "Subtitle": "TOP 10"
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Ingres Traffic",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Ingress Traffic"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Egress Traffic KB",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Egress Traffic KB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - TOTAL REQUESTS ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Request per Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File| measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "Callout": {
+ "Title": "TOTAL REQUESTS",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution2.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution2.name",
+ "dependson": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution2.name",
+ "DisplayName": "(omsSolutions).customSolution2.displayName",
+ "Description": "(omsSolutions).customSolution2.description",
+ "Author": "(omsSolutions).customSolution2.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Logs By Subscription and UserAgent",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Operations Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s,UserAgent_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Logs by Subscription and Operation",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Subscriptions",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#fcd116",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s,Operation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Requester Tracking ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "IPs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by RequesterIP_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ff8c00",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by RequesterIP_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Operations",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Top Operations",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by Operation_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by StorageService_s,Operation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Service",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Authentication Methods",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "SASvsAuthenticated",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AuthenticationType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#ff8c00",
+ "#00d8cc",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AuthenticationType_s,Status_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Authentication",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Error Logs",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Operation",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (Status_s:Success OR Status_s:SASSuccess)|measure count() by Operation_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#dd5900",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (Status_s:Success OR Status_s:SASSuccess)|measure count() by StorageAccount_s,StorageService_s,Operation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "StorageAccount",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Requester IPs Excluding Azure Native Calls",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "IPs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (UserAgent_s=\"\\\"Azure-Storage/0.5.0 (Native; Windows)\\\"\")|measure count() by RequesterIP_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (UserAgent_s=\"\\\"Azure-Storage/0.5.0 (Native; Windows)\\\"\")|measure count() by RequesterIP_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Requester IP",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "* Type=AzureStorage_CL Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s ",
+ "Callout": {
+ "Title": "Total Logs",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "name": "",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "[last(parameters('linkedWorkspaceSKU'))]"
+ }
+ },
+ "resources": [
+ {
+ "name": "saAzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "(opsInsightWorkspaceKey)",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "\" parameters('omsAutomationAccountName')\""
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsRunbook.version"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "name": "(runbooks).ingestLogsRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestLogsRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestLogsRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAIngestionLogs-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestLogsRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsEnablerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsEnablerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsEnablerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsEnablerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/ingestscheduleName",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Azure Storage Runbook Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/IngestScheduleGuid",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/schedules/ingestscheduleName",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleName"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "collectAuditLogs": "collectAuditLogs",
+ "collectionFromAllSubscriptions": "collectionFromAllSubscriptions"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces/linkedServices",
+ "name": "parameters('omsLogAnalyticsWorkspaceName')/Automation",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "properties": {
+ "resourceId": "Microsoft.Automation/automationAccounts//parameters('omsAutomationAccountName')"
+ },
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')"
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestMetricsRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestMetricsEnablerRunbook.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "product": "(omsSolutions).customSolution1.name",
+ "publisher": "(omsSolutions).customSolution1.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces// parameters('omsLogAnalyticsWorkspaceName')",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsEnablerRunbook.name",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA"
+ ]
+ }
+ },
+ {
+ "name": "(omsSolutions).customSolution2.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution2.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestLogsRunbook.name",
+ "Microsoft.OperationsManagement/solutions/(omsSolutions).customSolution1.solutionName"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution2.solutionName",
+ "product": "(omsSolutions).customSolution2.name",
+ "publisher": "(omsSolutions).customSolution2.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces// parameters('omsLogAnalyticsWorkspaceName')",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution2.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestLogsRunbook.name"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT754 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT754
new file mode 100644
index 0000000..0119fa5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT754
@@ -0,0 +1,3169 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToWorkspaceAnalyticsOnly.json"
+ ],
+ "timestamp": 1642962900736,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToWorkspaceAnalyticsOnly.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT754",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules",
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules/actions",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/savedsearches",
+ "microsoft.automation/automationaccounts",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT754",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "deploymentNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Used to create unique deployment names for subsequent deployments"
+ }
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ }
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "westcentralus",
+ "japaneast",
+ "uksouth",
+ "centralindia",
+ "canadacentral"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ }
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast",
+ "northcentralus",
+ "brazilsouth",
+ "uksouth",
+ "westcentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "linkedWorkspaceSKU": {
+ "type": "array",
+ "defaultValue": [
+ "pernode",
+ "OMS"
+ ],
+ "allowedValues": [
+ [
+ "pernode",
+ "OMS"
+ ],
+ [
+ "free",
+ "free"
+ ]
+ ]
+ },
+ "collectAuditLogs": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "This option creates extra collectors to collect and ingest storage audit logs"
+ }
+ },
+ "collectionFromAllSubscriptions": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Enables data collection from all subscriptions where Azure SPN has access"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestMetricsRunbook": {
+ "name": "AzureSAIngestionMetrics-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Inventory data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestLogsRunbook": {
+ "name": "AzureSAIngestionLogs-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Audit Logs into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestMetricsEnablerRunbook": {
+ "name": "AzureSAMetricsEnabler-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to enable Storage Analytics metrics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureSACreateSchedules-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "ingestScheduleGuid": "[guid(uniqueString(resourceGroup().id, deployment().name))]",
+ "metricsRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "logsRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAIngestionLogs-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "metricsEnablerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "azureSubscriptionId": "saAzureSubscriptionId",
+ "omsSolutions": {
+ "customSolution1": {
+ "name": "Azure Storage Analytics",
+ "solutionName": "[concat('AzureStorageAnalytics', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Storage Analytics",
+ "description": "Monitor and analyze Azure Storage Accounts",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "createScheduleResourceGroupType": "string",
+ "SchedulerFrequency": "Hourly",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "ingestScheduleName": "AzureSA-Scheduler-Hourly",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "alertArray": [
+ {
+ "searchName": "Azure Storage Account IO Throttling Limit",
+ "description": "Each standard storage account is capped to 20.000 IOPs . This alert is indicator that one of your storage accounts is at the risk of throttling and IO might be capped.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=VHDFile StorageAccount_s in {Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=StorageAccount Tier_s=Standard|measure count() by StorageAccount_s}| measure sum(MaxDiskIO_d) as TotalIO by StorageAccount_s |where TotalIO > 20000 ",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 15,
+ "scheduleQueryTimeSpan": 15,
+ "alertName": "Azure Storage Account IO Throttling Limits Reached"
+ },
+ {
+ "searchName": "Azure Premium Storage Account NotinUse",
+ "description": "Azure does not delete the vhd files associated with VMs when the VM is deleted. If the VM is suing premium storage you will be chardged for that storage untill you migarte the data and delete the storage account.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=VHDFile Uri_s=NullUri TimeGenerated>NOW-1HOUR |measure count() by StorageAccount_s",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Premium Storage Account NotinUse"
+ }
+ ],
+ "alertMetricArray": [
+ {
+ "searchName": "Azure Storage Quota Usage Critical",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approaching the storage account limits.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 90,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 90%"
+ },
+ {
+ "searchName": "Azure Storage Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 80%"
+ },
+ {
+ "searchName": "Azure Storage Availability Below 95pct",
+ "description": "Any value less than 100% indicates that some storage requests are failing. Examine other ErrorPercentage information to see the reason for failures. This alert is an indicator that Availability for requests fall below %95.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 95,
+ "operator": "lt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Availability Below 95pct"
+ },
+ {
+ "searchName": "Azure Storage End2End Latency Too High",
+ "description": "AverageE2ELatency is a measure of end-to-end latency that includes the time taken to read the request and send the response in addition to the time taken to process the request including network latency. This alert is an indicator that AvergaeE2ELAtency for storage account is above 100ms.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 100,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage End2End Latency Above 100ms"
+ },
+ {
+ "searchName": "Azure Storage High PercentThrottlingError",
+ "description": "Throttling errors occur when you exceed the scalability targets of a storage service. The storage service does this to ensure that no single client or tenant can use the service at the expense of others. This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentThrottlingError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentThrottlingError"
+ },
+ {
+ "searchName": "Azure Storage High PercentTimeoutError",
+ "description": "The PercentTimeoutError metric represents the timeout in storage requests and is an aggregation of the following metrics: ClientTimeoutError, AnonymousClientTimeoutError, SASClientTimeoutError, ServerTimeoutError, AnonymousServerTimeoutError, and SASServerTimeoutError.This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentTimeoutError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentTimeoutError"
+ },
+ {
+ "searchName": "Azure Storage High PercentNetworkError",
+ "description": "The PercentNetworkError metric is an aggregation of the following metrics NetworkError, AnonymousNetworkError, and SASNetworkError. These occur when the storage service detects a network error when the client makes a storage request.This alert is an indicator that storage account is facing network related errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentNetworkError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentNetworkError"
+ },
+ {
+ "searchName": "Azure Storage SASAuthorizationError",
+ "description": "If the client application attempts to use a SAS key that does not include the necessary permissions for the operation, the storage service returns an HTTP 404 (Not found) message to the client. At the same time, you will also see a non-zero value for SASAuthorizationError in the metrics. This alert is an indicator that storage account is facing SAS Autorizations errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(SASAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage SASAuthorizationError Detected"
+ },
+ {
+ "searchName": "Azure Storage High PercentAuthorizationError",
+ "description": "The percentage of requests that failed with an AuthorizationError. This alert is an indicator that storage account is facing authorization errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentAuthorizationError"
+ },
+ {
+ "searchName": "Azure Storage PercentClientOtherError",
+ "description": "Authenticated request that failed as expected. This error can represent many 300-400 level HTTP status codes and conditions such as NotFound and ResourceAlreadyExists. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentClientOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentClientOtherError"
+ },
+ {
+ "searchName": "Azure Storage High PercentServerOtherError",
+ "description": "Authenticated request that failed due to unknown server errors, most commonly returning an HTTP 500 status code. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentServerOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentServerOtherError"
+ },
+ {
+ "searchName": "Azure File Share Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL ShowinDesigner_d!=0 InventoryType_s=File | EXTEND product(div(ShareUsedGB_d,Quota_d),100) as ShareUsage | measure avg(ShareUsage) by FileShare_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure File Share Quota Usage is greater than 80%"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "properties": {
+ "sku": {
+ "name": "free"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution1.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "dependson": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution1.name",
+ "DisplayName": "(omsSolutions).customSolution1.displayName",
+ "Description": "(omsSolutions).customSolution1.description",
+ "Author": "(omsSolutions).customSolution1.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "Azure Storage Analytics",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Azure Storage Account Monitoring",
+ "Link": {
+ "Label": "More info ",
+ "Url": "https://github.com/Azure/azure-quickstart-templates/blob/master/demos/oms-azure-storage-analytics-solution/README.md"
+ }
+ },
+ "List": [
+ {
+ "Title": "Solution Overview",
+ "Content": "\nAzure Storage Analytics Solution utilizes native **Storage REST API** capabilities and **Storage Analytics** to enable inventory of storage accounts , capacity and transaction monitoring and collecting storage audit logs from a single or multiple Azure Subscriptions. \nCollected data can be utilized to create alerts and trigger automation runbooks.\n\n Inventory and metrics are collected every 15 mins, logs are collected every 60 mins and VHD blob scan is performed every 4hours."
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Usage for Subscription",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Accounts by Deployment type",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(SACurrent_d) by QuotaType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#55d455",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account Quota",
+ "Value": "% Utilized"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "80",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Azure Storage Inventory",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Inventory",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": [
+ "StorageAccount"
+ ]
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Inventory",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Capacity Usage",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Utilized (GB)",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#fcd116",
+ "#0072c6",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE Account",
+ "Value": "UsedinGB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "400000",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "450000",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "STORAGE ACCOUNT INVENTORY",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "SA by Tier",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Sku_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Location_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA by Location",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "200",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "250",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Total Requests",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalRequests per Storage Acc",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#55d455",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - E2E Latency (ms)",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "Latency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "50",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "100",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "IAAS - Disks by SA",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VHDs Attached to VMs",
+ "Subtitle": "VHD Count"
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=Inventory ShowinDesigner_d!=0 InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "VHD COUNT"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "35",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "40",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Throttling Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Throttling ErrorPct by Storage Service",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageService_s",
+ "Callout": {
+ "Title": "Avg per hour",
+ "Series": "",
+ "Operation": "Average"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": " Top 10 "
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "Count",
+ "baseUnit": "Ones",
+ "displayUnit": "AUTO"
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over Time",
+ "Subtitle": "TOP 10"
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Ingres Traffic",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Ingress Traffic"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Egress Traffic KB",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Egress Traffic KB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - TOTAL REQUESTS ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Request per Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File| measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "Callout": {
+ "Title": "TOTAL REQUESTS",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiversion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "name": "",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "saAzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "(opsInsightWorkspaceKey)",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "\" parameters('omsAutomationAccountName')\""
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsEnablerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsEnablerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsEnablerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsEnablerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/ingestscheduleName",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Azure Storage Runbook Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/IngestScheduleGuid",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/schedules/ingestscheduleName",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleName"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "collectAuditLogs": "collectAuditLogs",
+ "collectionFromAllSubscriptions": "collectionFromAllSubscriptions"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "product": "(omsSolutions).customSolution1.name",
+ "publisher": "(omsSolutions).customSolution1.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces// parameters('omsLogAnalyticsWorkspaceName')",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsEnablerRunbook.name",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT755 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT755
new file mode 100644
index 0000000..be08a24
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT755
@@ -0,0 +1,3759 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToWorkspaceWithAuditLogs.json"
+ ],
+ "timestamp": 1642962900756,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/deployToWorkspaceWithAuditLogs.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT755",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules",
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules/actions",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/savedsearches",
+ "microsoft.automation/automationaccounts",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT755",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "deploymentNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Used to create unique deployment names for subsequent deployments"
+ }
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ }
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "westcentralus",
+ "japaneast",
+ "uksouth",
+ "centralindia",
+ "canadacentral"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ }
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast",
+ "northcentralus",
+ "brazilsouth",
+ "uksouth",
+ "westcentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "linkedWorkspaceSKU": {
+ "type": "array",
+ "defaultValue": [
+ "pernode",
+ "OMS"
+ ],
+ "allowedValues": [
+ [
+ "pernode",
+ "OMS"
+ ],
+ [
+ "free",
+ "free"
+ ]
+ ]
+ },
+ "collectAuditLogs": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "This option creates extra collectors to collect and ingest storage audit logs"
+ }
+ },
+ "collectionFromAllSubscriptions": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Enables data collection from all subscriptions where Azure SPN has access"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestMetricsRunbook": {
+ "name": "AzureSAIngestionMetrics-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Inventory data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestLogsRunbook": {
+ "name": "AzureSAIngestionLogs-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure Storage Audit Logs into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestMetricsEnablerRunbook": {
+ "name": "AzureSAMetricsEnabler-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to enable Storage Analytics metrics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureSACreateSchedules-MS-Mgmt-SA",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "ingestScheduleGuid": "[guid(uniqueString(resourceGroup().id, deployment().name))]",
+ "metricsRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "logsRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAIngestionLogs-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "metricsEnablerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "azureSubscriptionId": "saAzureSubscriptionId",
+ "omsSolutions": {
+ "customSolution1": {
+ "name": "Azure Storage Analytics",
+ "solutionName": "[concat('AzureStorageAnalytics', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Storage Analytics",
+ "description": "Monitor and analyze Azure Storage Accounts",
+ "author": "volkanc@microsoft.com"
+ },
+ "customSolution2": {
+ "name": "Azure Storage Audit Logs",
+ "solutionName": "[concat('AzureStorageAuditLogs', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure Storage Audit Logs",
+ "description": "Monitor and analyze Azure Storage Account Audit Logs",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "createScheduleResourceGroupType": "string",
+ "SchedulerFrequency": "Hourly",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "ingestScheduleName": "AzureSA-Scheduler-Hourly",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "alertArray": [
+ {
+ "searchName": "Azure Storage Account IO Throttling Limit",
+ "description": "Each standard storage account is capped to 20.000 IOPs . This alert is indicator that one of your storage accounts is at the risk of throttling and IO might be capped.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=VHDFile StorageAccount_s in {Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=StorageAccount Tier_s=Standard|measure count() by StorageAccount_s}| measure sum(MaxDiskIO_d) as TotalIO by StorageAccount_s |where TotalIO > 20000 ",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 15,
+ "scheduleQueryTimeSpan": 15,
+ "alertName": "Azure Storage Account IO Throttling Limits Reached"
+ },
+ {
+ "searchName": "Azure Premium Storage Account NotinUse",
+ "description": "Azure does not delete the vhd files associated with VMs when the VM is deleted. If the VM is suing premium storage you will be chardged for that storage untill you migarte the data and delete the storage account.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=VHDFile Uri_s=NullUri TimeGenerated>NOW-1HOUR |measure count() by StorageAccount_s",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Premium Storage Account NotinUse"
+ }
+ ],
+ "alertMetricArray": [
+ {
+ "searchName": "Azure Storage Quota Usage Critical",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approaching the storage account limits.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 90,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 90%"
+ },
+ {
+ "searchName": "Azure Storage Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=StorageQuotas |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Account Quota Consumption is greater than 80%"
+ },
+ {
+ "searchName": "Azure Storage Availability Below 95pct",
+ "description": "Any value less than 100% indicates that some storage requests are failing. Examine other ErrorPercentage information to see the reason for failures. This alert is an indicator that Availability for requests fall below %95.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 95,
+ "operator": "lt",
+ "alertThrottleInMinutes": 240,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage Availability Below 95pct"
+ },
+ {
+ "searchName": "Azure Storage End2End Latency Too High",
+ "description": "AverageE2ELatency is a measure of end-to-end latency that includes the time taken to read the request and send the response in addition to the time taken to process the request including network latency. This alert is an indicator that AvergaeE2ELAtency for storage account is above 100ms.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(Availability_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 100,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage End2End Latency Above 100ms"
+ },
+ {
+ "searchName": "Azure Storage High PercentThrottlingError",
+ "description": "Throttling errors occur when you exceed the scalability targets of a storage service. The storage service does this to ensure that no single client or tenant can use the service at the expense of others. This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "critical",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentThrottlingError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentThrottlingError"
+ },
+ {
+ "searchName": "Azure Storage High PercentTimeoutError",
+ "description": "The PercentTimeoutError metric represents the timeout in storage requests and is an aggregation of the following metrics: ClientTimeoutError, AnonymousClientTimeoutError, SASClientTimeoutError, ServerTimeoutError, AnonymousServerTimeoutError, and SASServerTimeoutError.This alert is an indicator that storage account has reached the throttling limits and some requests are failing.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentTimeoutError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentTimeoutError"
+ },
+ {
+ "searchName": "Azure Storage High PercentNetworkError",
+ "description": "The PercentNetworkError metric is an aggregation of the following metrics NetworkError, AnonymousNetworkError, and SASNetworkError. These occur when the storage service detects a network error when the client makes a storage request.This alert is an indicator that storage account is facing network related errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentNetworkError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentNetworkError"
+ },
+ {
+ "searchName": "Azure Storage SASAuthorizationError",
+ "description": "If the client application attempts to use a SAS key that does not include the necessary permissions for the operation, the storage service returns an HTTP 404 (Not found) message to the client. At the same time, you will also see a non-zero value for SASAuthorizationError in the metrics. This alert is an indicator that storage account is facing SAS Autorizations errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(SASAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage SASAuthorizationError Detected"
+ },
+ {
+ "searchName": "Azure Storage High PercentAuthorizationError",
+ "description": "The percentage of requests that failed with an AuthorizationError. This alert is an indicator that storage account is facing authorization errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentAuthorizationError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentAuthorizationError"
+ },
+ {
+ "searchName": "Azure Storage PercentClientOtherError",
+ "description": "Authenticated request that failed as expected. This error can represent many 300-400 level HTTP status codes and conditions such as NotFound and ResourceAlreadyExists. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentClientOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentClientOtherError"
+ },
+ {
+ "searchName": "Azure Storage High PercentServerOtherError",
+ "description": "Authenticated request that failed due to unknown server errors, most commonly returning an HTTP 500 status code. This alert is an indicator that more than 1% of the requests failed with such errors.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions | measure avg(PercentServerOtherError_d) by StorageAccount_s interval 15Minutes",
+ "alertTresholdValue": 1,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 2,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Storage High PercentServerOtherError"
+ },
+ {
+ "searchName": "Azure File Share Quota Usage Warning",
+ "description": "Each Azure Subscription can host certain number of storage accounts. This alert is an indicator that your Azure Subscription is approacihing the storage account limits.",
+ "severity": "warning",
+ "query": "Type=AzureStorage_CL ShowinDesigner_d!=0 InventoryType_s=File | EXTEND product(div(ShareUsedGB_d,Quota_d),100) as ShareUsage | measure avg(ShareUsage) by FileShare_s interval 15MINUTES",
+ "alertTresholdValue": 80,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure Storage Analytics",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure File Share Quota Usage is greater than 80%"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "properties": {
+ "sku": {
+ "name": "free"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution1.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "dependson": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution1.name",
+ "DisplayName": "(omsSolutions).customSolution1.displayName",
+ "Description": "(omsSolutions).customSolution1.description",
+ "Author": "(omsSolutions).customSolution1.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "InformationBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "Title": "Azure Storage Analytics",
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Azure Storage Account Monitoring",
+ "Link": {
+ "Label": "More info ",
+ "Url": "https://github.com/Azure/azure-quickstart-templates/blob/master/demos/oms-azure-storage-analytics-solution/README.md"
+ }
+ },
+ "List": [
+ {
+ "Title": "Solution Overview",
+ "Content": "\nAzure Storage Analytics Solution utilizes native **Storage REST API** capabilities and **Storage Analytics** to enable inventory of storage accounts , capacity and transaction monitoring and collecting storage audit logs from a single or multiple Azure Subscriptions. \nCollected data can be utilized to create alerts and trigger automation runbooks.\n\n Inventory and metrics are collected every 15 mins, logs are collected every 60 mins and VHD blob scan is performed every 4hours."
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Usage for Subscription",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Accounts by Deployment type",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(SACurrent_d) by QuotaType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#55d455",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=StorageQuotas TimeGenerated >NOW-60MINUTES |measure avg(Quotapct_d) by AzureSubscription_s,QuotaType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account Quota",
+ "Value": "% Utilized"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "80",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Azure Storage Inventory",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Storage Inventory",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": [
+ "StorageAccount"
+ ]
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory AND NOT InventoryType_s=VHDFile | measure countdistinct(Uri_s) by InventoryType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Inventory",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Capacity Usage",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Utilized (GB)",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#fcd116",
+ "#0072c6",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsCapacity TimeGenerated>NOW-1HOUR |measure avg(Capacity_d) as UsedGB by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE Account",
+ "Value": "UsedinGB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "400000",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "450000",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "STORAGE ACCOUNT INVENTORY",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "SA by Tier",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Sku_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=StorageAccount |measure countdistinct(StorageAccount_s) by Location_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA by Location",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "200",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "250",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Total Requests",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalRequests per Storage Acc",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#55d455",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - E2E Latency (ms)",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(AverageE2ELatency_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "Latency"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "50",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "100",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "IAAS - Disks by SA",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VHDs Attached to VMs",
+ "Subtitle": "VHD Count"
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL ShowinDesigner_d!=0 MetricName_s=Inventory InventoryType_s=VHDFile LeaseState_s=leased | measure countdistinct(Uri_s) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "VHD COUNT"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "35",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "40",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Account Throttling Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Throttling ErrorPct by Storage Service",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageService_s",
+ "Callout": {
+ "Title": "Avg per hour",
+ "Series": "",
+ "Operation": "Average"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL |measure avg(PercentThrottlingError_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGEACCOUNT",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": " Top 10 "
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "Count",
+ "baseUnit": "Ones",
+ "displayUnit": "AUTO"
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over Time",
+ "Subtitle": "TOP 10"
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Ingres Traffic",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Ingress Traffic"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - Egress Traffic KB",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "STORAGE ACCOUNT",
+ "Value": "Egress Traffic KB"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "BLOB - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Blob |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - TOTAL REQUESTS ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Request per Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table TimeGenerated>NOW-1HOUR |measure sum(TotalRequests_d) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Storage Account",
+ "Value": "RequestCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TABLE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Table |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "QUEUE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=Queue |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE STORAGE METRICS",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Ingress Traffic KB Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File| measure sum(TotalIngress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalIngress_d,1024) as IngressKB | measure sum(IngressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Egress Traffic KB Over time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalEgress_d) by StorageAccount_s |top 10 } | EXTEND div(TotalEgress_d,1024) as EgressKB | measure sum(EgressKB) by StorageAccount_s interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Total Requests Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File StorageAccount_s IN {Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File | measure sum(TotalRequests_d) by StorageAccount_s |top 10 } |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "FILE - SA Request Errors",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "TotalErrorPct by Storage Account",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError) as AvgPctError by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Percentage",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#ff8c00",
+ "#ffb900"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |EXTEND sum(PercentClientOtherError_d,PercentNetworkError_d,PercentTimeoutError_d,PercentThrottlingError_d,PercentAuthorizationError_d,PercentServerOtherError_d) AS TotalError |measure avg(TotalError)as AvgPctError by StorageAccount_s,StorageService_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "SA",
+ "Value": "Error %"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutStackedBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Request ErrorPct Distribution",
+ "newGroup": false
+ },
+ "charts": [
+ {
+ "Header": {
+ "Title": "Client Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentClientOtherError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Network Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentNetworkError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ },
+ {
+ "Header": {
+ "Title": "Authorization Error Pct Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions StorageService_s=File |measure avg(PercentAuthorizationError_d) by StorageAccount_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=MetricsTransactions |measure sum(TotalRequests_d) by StorageAccount_s Interval 15Minutes",
+ "Callout": {
+ "Title": "TOTAL REQUESTS",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution2.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution2.name",
+ "dependson": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution2.name",
+ "DisplayName": "(omsSolutions).customSolution2.displayName",
+ "Description": "(omsSolutions).customSolution2.description",
+ "Author": "(omsSolutions).customSolution2.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Logs By Subscription and UserAgent",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Operations Over Time",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s,UserAgent_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Logs by Subscription and Operation",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Subscriptions",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#fcd116",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": " Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s,Operation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Requester Tracking ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "IPs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by RequesterIP_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ff8c00",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by RequesterIP_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Storage Operations",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Top Operations",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": " Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by Operation_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by StorageService_s,Operation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Service",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Authentication Methods",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "SASvsAuthenticated",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AuthenticationType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#ff8c00",
+ "#00d8cc",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "* Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AuthenticationType_s,Status_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Authentication",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Error Logs",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Operation",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": " Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (Status_s:Success OR Status_s:SASSuccess)|measure count() by Operation_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#e81123",
+ "#dd5900",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (Status_s:Success OR Status_s:SASSuccess)|measure count() by StorageAccount_s,StorageService_s,Operation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "StorageAccount",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Requester IPs Excluding Azure Native Calls",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "IPs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (UserAgent_s=\"\\\"Azure-Storage/0.5.0 (Native; Windows)\\\"\")|measure count() by RequesterIP_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs AND NOT (UserAgent_s=\"\\\"Azure-Storage/0.5.0 (Native; Windows)\\\"\")|measure count() by RequesterIP_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Requester IP",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "Type=AzureStorage_CL MetricName_s=AuditLogs | measure count() by AzureSubscription_s ",
+ "Callout": {
+ "Title": "Total Logs",
+ "Series": "",
+ "Operation": "Sum"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiversion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "name": "",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "saAzureSubscriptionId",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Azure Subscription Id",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "(opsInsightWorkspaceKey)",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "\" parameters('omsAutomationAccountName')\""
+ }
+ },
+ {
+ "name": "AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": 0,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAIngestionMetrics-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsRunbook.version"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "name": "(runbooks).ingestLogsRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestLogsRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestLogsRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAIngestionLogs-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestLogsRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSACreateSchedules-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestMetricsEnablerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/variables/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestMetricsEnablerRunbook.type",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "(runbooks).ingestMetricsEnablerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/scripts/AzureSAMetricsEnabler-MS-Mgmt-SA.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestMetricsEnablerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/ingestscheduleName",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Azure Storage Runbook Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "parameters('omsAutomationAccountName')/IngestScheduleGuid",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "omsAutomationRegion",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/schedules/ingestscheduleName",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleName"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "collectAuditLogs": "collectAuditLogs",
+ "collectionFromAllSubscriptions": "collectionFromAllSubscriptions"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestMetricsRunbook.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestMetricsEnablerRunbook.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution1.solutionName",
+ "product": "(omsSolutions).customSolution1.name",
+ "publisher": "(omsSolutions).customSolution1.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces// parameters('omsLogAnalyticsWorkspaceName')",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution1.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestMetricsEnablerRunbook.name",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/saAzureSubscriptionId",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_ID-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-OPSINSIGHTS_WS_KEY-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationAccount-MS-Mgmt-SA",
+ "Microsoft.Automation/automationAccounts/variables// parameters('omsAutomationAccountName')/AzureSAIngestion-AzureAutomationResourceGroup-MS-Mgmt-SA"
+ ]
+ }
+ },
+ {
+ "name": "(omsSolutions).customSolution2.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "omsLogAnalyticsRegion",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution2.name",
+ "Microsoft.Automation/automationAccounts/ parameters('omsAutomationAccountName')/runbooks/(runbooks).ingestLogsRunbook.name",
+ "Microsoft.OperationsManagement/solutions/(omsSolutions).customSolution1.solutionName"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution2.solutionName",
+ "product": "(omsSolutions).customSolution2.name",
+ "publisher": "(omsSolutions).customSolution2.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces// parameters('omsLogAnalyticsWorkspaceName')",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views// parameters('omsLogAnalyticsWorkspaceName')/(omsSolutions).customSolution2.name",
+ "Microsoft.Automation/automationAccounts/runbooks// parameters('omsAutomationAccountName')/(runbooks).ingestLogsRunbook.name"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": false
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')",
+ "Microsoft.OperationalInsights/workspaces/ parameters('omsLogAnalyticsWorkspaceName')/views/(omsSolutions).customSolution1.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "Total",
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertBreach"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT756 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT756
new file mode 100644
index 0000000..f242475
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT756
@@ -0,0 +1,272 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/omsDeployStorageAnalyticsOnly.json"
+ ],
+ "timestamp": 1642962900779,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/omsDeployStorageAnalyticsOnly.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT756",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT756",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "deploymentNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Used to create unique deployment names for subsequent deployments"
+ }
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ }
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "westcentralus",
+ "japaneast",
+ "uksouth",
+ "centralindia",
+ "canadacentral"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ }
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast",
+ "northcentralus",
+ "brazilsouth",
+ "uksouth",
+ "westcentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsWorkspaceType": {
+ "type": "string",
+ "allowedValues": [
+ "Linked",
+ "Unlinked"
+ ],
+ "metadata": {
+ "description": "Specify the workspace type"
+ }
+ },
+ "linkedWorkspaceSKU": {
+ "type": "array",
+ "defaultValue": [
+ "pernode",
+ "OMS"
+ ],
+ "allowedValues": [
+ [
+ "pernode",
+ "OMS"
+ ],
+ [
+ "free",
+ "free"
+ ]
+ ],
+ "metadata": {
+ "description": "Choose the SKU for linked workspace , only valid if omsWorkspaceType is Linked otherwise ignored."
+ }
+ },
+ "collectAuditLogs": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "This option creates extra collectors to collect and ingest storage audit logs"
+ }
+ },
+ "collectionFromAllSubscriptions": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Enables data collection from all subscriptions where Azure SPN has access"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "nestedTemplates": {
+ "deployToLinkedWorkspaceAnalyticsOnly": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/nestedtemplates/deployToLinkedWorkspaceAnalyticsOnly.json parameters('_artifactsLocationSasToken')",
+ "deployToWorkspaceAnalyticsOnly": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/nestedtemplates/deployToWorkspaceAnalyticsOnly.json parameters('_artifactsLocationSasToken')"
+ }
+ },
+ "resources": [
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "LinkedWSAnalyticsOnly-deploymentNameSuffix",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).deployToLinkedWorkspaceAnalyticsOnly",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "deploymentNameSuffix": {
+ "value": "deploymentNameSuffix"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": ""
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "omsLogAnalyticsRegion"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "value": ""
+ },
+ "omsAutomationRegion": {
+ "value": "omsAutomationRegion"
+ },
+ "linkedWorkspaceSKU": {
+ "value": [
+ "pernode",
+ "OMS"
+ ]
+ },
+ "collectAuditLogs": {
+ "value": "collectAuditLogs"
+ },
+ "collectionFromAllSubscriptions": {
+ "value": "collectionFromAllSubscriptions"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2"
+ }
+ }
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "AnalyticsOnly-deploymentNameSuffix",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).deployToWorkspaceAnalyticsOnly",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "deploymentNameSuffix": {
+ "value": "deploymentNameSuffix"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": ""
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "omsLogAnalyticsRegion"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "value": ""
+ },
+ "omsAutomationRegion": {
+ "value": "omsAutomationRegion"
+ },
+ "collectAuditLogs": {
+ "value": "collectAuditLogs"
+ },
+ "collectionFromAllSubscriptions": {
+ "value": "collectionFromAllSubscriptions"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT757 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT757
new file mode 100644
index 0000000..d3af39e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT757
@@ -0,0 +1,278 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/omsDeployStorageAnalyticsWithAuditLogs.json"
+ ],
+ "timestamp": 1642962900789,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/nestedtemplates/omsDeployStorageAnalyticsWithAuditLogs.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT757",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT757",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "deploymentNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Used to create unique deployment names for subsequent deployments"
+ }
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ }
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "westcentralus",
+ "japaneast",
+ "uksouth",
+ "centralindia",
+ "canadacentral"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ }
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ }
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast",
+ "northcentralus",
+ "brazilsouth",
+ "uksouth",
+ "westcentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ }
+ },
+ "omsWorkspaceType": {
+ "type": "string",
+ "allowedValues": [
+ "Linked",
+ "Unlinked"
+ ],
+ "metadata": {
+ "description": "Specify the workspace type"
+ }
+ },
+ "linkedWorkspaceSKU": {
+ "type": "array",
+ "defaultValue": [
+ "pernode",
+ "OMS"
+ ],
+ "allowedValues": [
+ [
+ "pernode",
+ "OMS"
+ ],
+ [
+ "free",
+ "free"
+ ]
+ ],
+ "metadata": {
+ "description": "Choose the SKU for linked workspace , only valid if omsWorkspaceType is Linked otherwise ignored."
+ }
+ },
+ "collectAuditLogs": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "This option creates extra collectors to collect and ingest storage audit logs"
+ }
+ },
+ "collectionFromAllSubscriptions": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Enables data collection from all subscriptions where Azure SPN has access"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "nestedTemplates": {
+ "deployToLinkedWorkspaceWithAuditLogs": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/nestedtemplates/deployToLinkedWorkspaceWithAuditLogs.json parameters('_artifactsLocationSasToken')",
+ "deployToWorkspaceWithAuditLogs": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2/nestedtemplates/deployToWorkspaceWithAuditLogs.json parameters('_artifactsLocationSasToken')"
+ }
+ },
+ "resources": [
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "AS-AnalyticswithLogs-Linked-deploymentNameSuffix",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).deployToLinkedWorkspaceWithAuditLogs",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "deploymentNameSuffix": {
+ "value": "deploymentNameSuffix"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": ""
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "omsLogAnalyticsRegion"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "value": ""
+ },
+ "omsAutomationRegion": {
+ "value": "omsAutomationRegion"
+ },
+ "linkedWorkspaceSKU": {
+ "value": [
+ "pernode",
+ "OMS"
+ ]
+ },
+ "collectAuditLogs": {
+ "value": "collectAuditLogs"
+ },
+ "collectionFromAllSubscriptions": {
+ "value": "collectionFromAllSubscriptions"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2"
+ }
+ }
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "AS-AnalyticswithLogs-deploymentNameSuffix",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).deployToWorkspaceWithAuditLogs",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "deploymentNameSuffix": {
+ "value": "deploymentNameSuffix"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": ""
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "omsLogAnalyticsRegion"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "value": ""
+ },
+ "omsAutomationRegion": {
+ "value": "omsAutomationRegion"
+ },
+ "linkedWorkspaceSKU": {
+ "value": [
+ "pernode",
+ "OMS"
+ ]
+ },
+ "collectAuditLogs": {
+ "value": "collectAuditLogs"
+ },
+ "collectionFromAllSubscriptions": {
+ "value": "collectionFromAllSubscriptions"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Volkanco/AzureDeploy/master/OMSSolutions/oms-azure-storage-analytics-solution-v2"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT758 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT758
new file mode 100644
index 0000000..43dbee1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT758
@@ -0,0 +1,303 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/azuredeploy.json",
+ "/demos/oms-azure-storage-analytics-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900797,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-storage-analytics-solution/azuredeploy.json",
+ "/demos/oms-azure-storage-analytics-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT758",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT758",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "deploymentNameSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Provide an unique deployment names for each deployment subsequent deployments"
+ },
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "westcentralus",
+ "japaneast",
+ "uksouth",
+ "centralindia",
+ "canadacentral"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing OMS workspace"
+ },
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode",
+ "Per GB"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ },
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ },
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast",
+ "northcentralus",
+ "brazilsouth",
+ "uksouth",
+ "westcentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ },
+ "value": "eastus2"
+ },
+ "omsWorkspaceType": {
+ "type": "string",
+ "allowedValues": [
+ "Linked",
+ "Unlinked"
+ ],
+ "metadata": {
+ "description": "Specify the workspace type"
+ },
+ "value": "Unlinked"
+ },
+ "linkedWorkspaceSKU": {
+ "type": "array",
+ "defaultValue": [
+ "pernode",
+ "OMS"
+ ],
+ "allowedValues": [
+ [
+ "pernode",
+ "OMS"
+ ],
+ [
+ "free",
+ "free"
+ ],
+ [
+ "Per GB",
+ "OMS"
+ ]
+ ],
+ "metadata": {
+ "description": "Choose the SKU for linked workspace , only valid if omsWorkspaceType is Linked otherwise ignored."
+ },
+ "value": [
+ "free",
+ "free"
+ ]
+ },
+ "collectAuditLogs": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "This option creates extra collectors to collect and ingest storage audit logs"
+ },
+ "value": "Disabled"
+ },
+ "collectionFromAllSubscriptions": {
+ "type": "string",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "Enables data collection from all subscriptions where Azure SPN has access"
+ },
+ "value": "Disabled"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "nestedTemplates": {
+ "omsDeployWithAuditLogs": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/nestedtemplates/omsDeployStorageAnalyticsWithAuditLogs.json parameters('_artifactsLocationSasToken')",
+ "omsDeployStorageAnalyticsOnly": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution/nestedtemplates/omsDeployStorageAnalyticsOnly.json parameters('_artifactsLocationSasToken')"
+ }
+ },
+ "resources": [
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "omsDeployWithAuditLogs-GEN-UNIQUE-30",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsDeployWithAuditLogs",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "deploymentNameSuffix": {
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "value": "eastus2"
+ },
+ "omsWorkspaceType": {
+ "value": "Unlinked"
+ },
+ "linkedWorkspaceSKU": {
+ "value": [
+ "free",
+ "free"
+ ]
+ },
+ "collectAuditLogs": {
+ "value": "Disabled"
+ },
+ "collectionFromAllSubscriptions": {
+ "value": "Disabled"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution"
+ }
+ }
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "omsDeployStorageAnalyticsOnly-GEN-UNIQUE-30",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsDeployStorageAnalyticsOnly",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "deploymentNameSuffix": {
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "value": "eastus2"
+ },
+ "omsWorkspaceType": {
+ "value": "Unlinked"
+ },
+ "linkedWorkspaceSKU": {
+ "value": [
+ "free",
+ "free"
+ ]
+ },
+ "collectAuditLogs": {
+ "value": "Disabled"
+ },
+ "collectionFromAllSubscriptions": {
+ "value": "Disabled"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-storage-analytics-solution"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT759 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT759
new file mode 100644
index 0000000..df54209
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT759
@@ -0,0 +1,1551 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-vminventory-solution/azuredeploy.json",
+ "/demos/oms-azure-vminventory-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900803,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-vminventory-solution/azuredeploy.json",
+ "/demos/oms-azure-vminventory-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT759",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules",
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules/actions",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/savedsearches",
+ "microsoft.automation/automationaccounts",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT759",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "australiasoutheast",
+ "wescentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing Log Analytics workspace"
+ },
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the SKU for Log Analytics"
+ },
+ "value": "standalone"
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ },
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ },
+ "value": "eastus2"
+ },
+ "omsDataIngestionFrequency": {
+ "type": "int",
+ "defaultValue": 30,
+ "allowedValues": [
+ 15,
+ 30,
+ 60
+ ],
+ "metadata": {
+ "description": "Specify the Azure VM Inventory retrieval frequency"
+ },
+ "value": 30
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ },
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "ingestSchedulerGuid": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "GUID for the schedule creation - automatically created at deploy"
+ }
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestParentRunbook": {
+ "name": "AzureVMInventory-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure VM Inventory data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureVMInventory-Schedules-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "parentRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure VM Inventory",
+ "solutionName": "[concat('AzureVMInventory', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure VM Inventory",
+ "description": "Monitor Azure VMs deployed across subscriptions",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureVMInventory-OPSINSIGHT_WS_KEY",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureVMInventory-AzureAutomationAccount-MS-Mgmt",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureVMInventory-AzureAutomationResourceGroup-MS-Mgmt",
+ "createScheduleResourceGroupType": "string",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "omsAutomationSku": "basic",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "ingestScheduleName": "AzureVMInventory-Scheduler-Hourly",
+ "collectDiskInventory": "1",
+ "collectNICandNSGInventory": "1",
+ "alertArray": [
+ {
+ "searchName": "Azure VMs in Stopped State",
+ "description": "Azure VMs which shutdown from within operating system will continue incurring charges. Stop the VM from the portal to prevent unnecessary consumption.",
+ "severity": "warning",
+ "query": "Type=AzureVMInventory_CL MetricName_s=VMInventory Status_s=Stopped | measure countdistinct(ID_s) by AzureSubscription_s,VmName_s",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure VM Inventory",
+ "scheduleIntervalInMinutes": 15,
+ "scheduleQueryTimeSpan": 15,
+ "alertName": "Azure VM Found in Stopped State"
+ },
+ {
+ "searchName": "Azure Quota Usage",
+ "description": "Each Azure Subscription has quotas for VM cores per region. If the quota is reached new VMs annot be created",
+ "severity": "critical",
+ "query": "Type=AzureVMInventory_CL MetricName_s=ARMVMUsageStats | EXTEND div(product(currentValue_d,100),limit_d) as UsedPct | Measure Max(UsedPct) by Location_s,Usagemetric_s | where AggregatedValue >90",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure VM Inventory",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Quota Usage Reached 90% of the Subscription Quota"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-20",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "properties": {
+ "sku": {
+ "name": "standalone"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.name",
+ "dependsOn": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "DisplayName": "(omsSolutions).customSolution.displayName",
+ "Description": "(omsSolutions).customSolution.description",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Subscription",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VM Count",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(ID_s) by AzureSubscription_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#9b4f96",
+ "#00d8cc",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(ID_s) by AzureSubscription_s,Status_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Size",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Size",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by HWProfile_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#fcd116",
+ "#7fba00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by HWProfile_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "VMSIZE",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Location",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Location",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Location_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#ff8c00",
+ "#eb3c00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Location_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Location",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM by Deployement Type",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Classic vs ARM",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by DeploymentType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#ff8c00",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(ID_s) by AzureSubscription_s,DeploymentType_s,OperatingSystem_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "VMCount",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM Status",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Status_s interval 30Minutes",
+ "Callout": {
+ "Title": "Running",
+ "Series": "Running",
+ "Operation": "Last Sample"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory Status_s=Running | measure countdistinct(VmName_s) by HWProfile_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Size",
+ "Value": "RuningVM"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "NumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TAGGED VMs",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(Tag_s) by AzureSubscription_s",
+ "Legend": "Tagged VM Count"
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(VmName_s) by Tag_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Subnet",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Subnets",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNIC | measure countdistinct(VmName_s) by subnet_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNIC | measure countdistinct(VmName_s) by AzureSubscription_s,subnet_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "InputEndpoints ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "No of VMs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMEndpoint | measure countdistinct(VmName_s) by endpointName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMEndpoint | measure countdistinct(VmName_s) by endpointName_s,privatePort_d",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "EndpointName",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "NSG Rules Applied",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "No of VMs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule | measure countdistinct(VmName_s) by RuleName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#fcd116",
+ "#0072c6",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule | measure countdistinct(VmName_s) by RuleName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Rule",
+ "Value": "CountVM"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "NSG - Allowed Ports ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Count of Computers",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule access_s=Allow | measure countdistinct(VmName_s) by destinationPortRange_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#7fba00",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule access_s=Allow | measure countdistinct(VmName_s) by sourcePortRange_s,destinationPortRange_s,protocol_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Source",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Cores Utilized",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Per Region",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=ARMVMUsageStats TimeGenerated>NOW-30Minutes Usagemetric_s=cores |measure max(currentValue_d) by Location_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=ARMVMUsageStats TimeGenerated>NOW-30Minutes Usagemetric_s=cores |measure max(currentValue_d) by AzureSubscription_sLocation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Disk Count by IO",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "MAX DISK IO",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by MaxDiskIO_d",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by DiskIOType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "IOTYPE",
+ "Value": "DiskCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Disks by Storage Account",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "StorageAccount",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM Extensions Inventory",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Extension Count",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMExtensions | measure countdistinct(VmName_s) by Extension_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMExtensions | measure countdistinct(VmName_s) by Extension_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Extension",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Status_s interval 30Minutes",
+ "Callout": {
+ "Title": "Running",
+ "Series": "Running",
+ "Operation": "Last Sample"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "name": "GEN-UNIQUE-30",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "(opsInsightWorkspaceKey)",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName')), '2015-11-01-preview').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "AzureVMInventory-AzureAutomationAccount-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"GEN-UNIQUE-30\""
+ }
+ },
+ {
+ "name": "AzureVMInventory-AzureAutomationResourceGroup-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestParentRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHT_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestParentRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestParentRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestParentRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHT_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/ingestscheduleName-[newGuid()]",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Ingestion API Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/[newGuid()]",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/schedules/ingestscheduleName-[newGuid()]",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleName-[newGuid()]"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/[newGuid()]",
+ "type": "Microsoft.Automation/automationAccounts/jobs",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestParentRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "runbook": {
+ "name": "(runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "frequency": 30,
+ "getNICandNSG": "1",
+ "getDiskInfo": "1",
+ "clearLocks": "1"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestParentRunbook.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.name",
+ "Microsoft.Automation/automationAccounts/runbooks//GEN-UNIQUE-30/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/runbooks//GEN-UNIQUE-30/(runbooks).ingestParentRunbook.name"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": true
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": true
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT76 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT76
new file mode 100644
index 0000000..381f6d2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT76
@@ -0,0 +1,643 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeployds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885484,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeployds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT76",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT76",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Admin user name for the VMs"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password for the VMs (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "cmUsername": {
+ "type": "string",
+ "defaultValue": "cmadmin",
+ "metadata": {
+ "description": "User name for the Cloudera Manager"
+ }
+ },
+ "cmPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "password for the Cloudera Manager (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS name where the VMs will be exposed"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "masterStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for master nodes (defaults to Premium_LRS)"
+ },
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for worker nodes (defaults to Standard_LRS)"
+ },
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "clouderavnet",
+ "metadata": {
+ "description": "The name of the virtual network provisioned for the deployment"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "vnetNewOrExisting": {
+ "type": "string",
+ "defaultValue": "new",
+ "allowedValues": [
+ "new",
+ "existing"
+ ],
+ "metadata": {
+ "description": "Indicator for new or exiting Virtual Network"
+ }
+ },
+ "virtualNetworkRGName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Resource Group Name for Vnet. For new VNet leave it empty, otherwise type in existing resource group name"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "clouderasubnet",
+ "metadata": {
+ "description": "Subnet name for the virtual network where resources will be provisioned"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "Virtual Network address CIDR"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "CIDR for the subnet where VMs will be placed"
+ }
+ },
+ "masterNodeIPAddress": {
+ "type": "string",
+ "defaultValue": "10.3.0.4",
+ "metadata": {
+ "description": "IP address for the first master"
+ }
+ },
+ "dataNodeIPOffSetFromMaster": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "IP address from the master node, for example if the first master is 10.1.1.1, then the first dataNode would be 10.1.1.11"
+ }
+ },
+ "tshirtSize": {
+ "type": "string",
+ "defaultValue": "Eval",
+ "allowedValues": [
+ "Eval",
+ "Prod"
+ ],
+ "metadata": {
+ "description": "T-shirt size of the Cloudera cluster (Eval, Prod)"
+ },
+ "value": "Eval"
+ },
+ "numberOfDataNodes": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Number of data nodes for Prod (defaults to 3)"
+ },
+ "value": 3
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D8s_v3",
+ "metadata": {
+ "description": "The size of the VMs deployed in the cluster (defaults to Standard_DS13)"
+ },
+ "allowedValues": [
+ "Standard_D16s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D8s_v3"
+ ],
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "type": "string",
+ "defaultValue": "ClouderaCentOS6_7",
+ "metadata": {
+ "description": "The OS VM Image (defaults to ClouderaCentOS6_7)"
+ },
+ "allowedValues": [
+ "ClouderaCentOS6_7",
+ "ClouderaCentOS6_8"
+ ],
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "type": "string",
+ "defaultValue": "Company",
+ "metadata": {
+ "description": "Your Company"
+ },
+ "value": "company"
+ },
+ "emailAddress": {
+ "type": "string",
+ "defaultValue": "email@yourcompany.com",
+ "metadata": {
+ "description": "your email"
+ },
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "type": "string",
+ "defaultValue": "123456789",
+ "metadata": {
+ "description": "your business phone number"
+ },
+ "value": "123456789"
+ },
+ "firstName": {
+ "type": "string",
+ "defaultValue": "FirstName",
+ "metadata": {
+ "description": "Your FirstName"
+ },
+ "value": "FirstName"
+ },
+ "lastName": {
+ "type": "string",
+ "defaultValue": "LastName",
+ "metadata": {
+ "description": "Your LastName"
+ },
+ "value": "LastName"
+ },
+ "jobRole": {
+ "type": "string",
+ "defaultValue": "Administrator",
+ "metadata": {
+ "description": "Job Role"
+ },
+ "allowedValues": [
+ "Administrator",
+ "Analyst (Industry/Finance)",
+ "Analyst (Technical)",
+ "Architect",
+ "C level",
+ "Consultant",
+ "Developer",
+ "Director",
+ "Engineer",
+ "Individual contributor",
+ "Manager",
+ "Partner",
+ "Student",
+ "VP"
+ ],
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "type": "string",
+ "defaultValue": "Analytics / Business Intelligence",
+ "metadata": {
+ "description": "Job Function"
+ },
+ "allowedValues": [
+ "Analytics / Business Intelligence",
+ "Big Data / Architecture",
+ "Data Warehouse / Management",
+ "Data Science",
+ "Database",
+ "ETL / ELT",
+ "Infrastructure",
+ "IT",
+ "Marketing / Sales",
+ "Networking",
+ "Manager",
+ "Security / Compliance",
+ "Storage"
+ ],
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "templateAPIVersion": "2015-11-01",
+ "resourceAPIVersion": "2015-06-15",
+ "installCDH": "True",
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "scriptsUriDescription": "For Command Line Deployment, scriptsUri must point to an Azure-accessible location like: https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos",
+ "scriptsUri": "[uri(deployment().properties.templateLink.uri, '.')]",
+ "share-resourcesUri": "[uri(deployment().properties.templateLink.uri, '.')]/shared-resources-new-vnet.json",
+ "data-nodeUri": "[concat(variables('scriptsUri'), '/data-node-', toLower(subString(parameters('vmSize'), 0, 13)), '.json')]",
+ "sa": "10.3.0.4",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterStorageAccount": {
+ "type": "Premium_LRS"
+ },
+ "workerStorageAccount": {
+ "type": "Standard_LRS"
+ },
+ "clusterTshirtSizeEval": {
+ "masterNodeCount": 1,
+ "dataNodeCount": 3,
+ "highAvailability": "false"
+ },
+ "clusterTshirtSizeProd": {
+ "masterNodeCount": 3,
+ "dataNodeCount": 3,
+ "highAvailability": "true"
+ },
+ "clusterSpec": "concat(clusterTshirtSize, parameters(tshirtSize))",
+ "vmImageInfo": {
+ "ClouderaCentOS6_7": {
+ "plan": {
+ "name": "cloudera-centos-6",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-6"
+ },
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-6",
+ "sku": "cloudera-centos-6",
+ "version": "latest"
+ }
+ },
+ "ClouderaCentOS6_8": {
+ "plan": {
+ "name": "6_8",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-os"
+ },
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-os",
+ "sku": "6_8",
+ "version": "latest"
+ }
+ },
+ "ClouderaCentOS6_7Germany": {
+ "plan": null,
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-os",
+ "sku": "6_7",
+ "version": "latest"
+ }
+ }
+ },
+ "vmSpec": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ },
+ "networkSpec": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ },
+ "newVNetId": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "existingVNetId": "parameters('virtualNetworkRGName')/Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "VNetId": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resources": [
+ {
+ "name": "shared-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/shared-resources-new-vnet.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "masterNodeASName": {
+ "value": "(vmSpec).masterNodeASName"
+ },
+ "dataNodeASName": {
+ "value": "(vmSpec).dataNodeASName"
+ }
+ }
+ }
+ },
+ {
+ "name": "master-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/master-node.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "storageAccount": {
+ "value": {
+ "type": "Premium_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).masterNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "data-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('data-nodeUri')]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "templateAPIVersion": {
+ "value": "2015-11-01"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "storageAccount": {
+ "value": {
+ "type": "Standard_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).dataNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "setup-cloudera",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/data-node",
+ "Microsoft.Resources/deployments/master-node"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/setup-cloudera.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "fqdn": {
+ "value": "[reference('master-node').outputs.fqdn.value]"
+ },
+ "cmUsername": {
+ "value": "cmadmin"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "company": {
+ "value": "Company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ },
+ "installCDH": {
+ "value": "True"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT760 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT760
new file mode 100644
index 0000000..747dd5c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT760
@@ -0,0 +1,352 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-vminventory-solution/azuredeployonlyautomation.json",
+ "/demos/oms-azure-vminventory-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900816,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-vminventory-solution/azuredeployonlyautomation.json",
+ "/demos/oms-azure-vminventory-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT760",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT760",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceId": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specify the Log Analytics workspace Id where Azure VM Inventory solution is deployed"
+ }
+ },
+ "omsWorkspaceKey": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specify the Log Analytics workspace key where Azure VM Inventory solution is deployed"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Use an existing Automation account or create a new"
+ },
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "southeastasia",
+ "eastus2",
+ "southcentralus",
+ "japaneast",
+ "southeastasia",
+ "southcentralus",
+ "northeurope",
+ "canadacentral",
+ "australiasoutheast",
+ "centralindia",
+ "japaneast"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your OMS Automation Account"
+ },
+ "value": "eastus2"
+ },
+ "omsAutomationSku": {
+ "type": "string",
+ "defaultValue": "basic",
+ "allowedValues": [
+ "free",
+ "basic"
+ ],
+ "metadata": {
+ "description": "Specify the SKU for Automation Account"
+ }
+ },
+ "omsDataIngestionFrequency": {
+ "type": "int",
+ "defaultValue": 30,
+ "allowedValues": [
+ 15,
+ 30,
+ 60
+ ],
+ "metadata": {
+ "description": "Specify the Azure VM Inventory retrieval frequency"
+ },
+ "value": 30
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ },
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "ingestSchedulerGuid": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "GUID for the schedule creation - create a unique before deploy"
+ }
+ },
+ "omsLogAnalyticsWorkspaceName": {
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "value": "standalone"
+ }
+ },
+ "variables": {
+ "runbooks": {
+ "ingestParentRunbook": {
+ "name": "AzureVMInventory-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically ingest Azure VM Inventory data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "Id": ""
+ },
+ "ingestSchedulerRunbook": {
+ "name": "AzureVMInventory-Schedules-MS-Mgmt",
+ "version": "1.0.0.1",
+ "description": "Runbook to automatically create required schedules for OMS Log Analytics ingestion",
+ "type": "PowerShell",
+ "Id": ""
+ }
+ },
+ "parentRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "schedulerRunbookUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "opsInsightWorkspaceID": "AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureVMInventory-OPSINSIGHT_WS_KEY",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureVMInventory-AzureAutomationAccount-MS-Mgmt",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureVMInventory-AzureAutomationResourceGroup-MS-Mgmt",
+ "createScheduleResourceGroupType": "string",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "collectDiskInventory": "1",
+ "collectNICandNSGInventory": "1",
+ "ingestInterval": "1",
+ "ingestFrequency": "hour",
+ "ingestScheduleName": "AzureVMInventory-Scheduler-Hourly"
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "name": "GEN-UNIQUE-30",
+ "type": "Microsoft.Automation/automationAccounts",
+ "properties": {
+ "sku": {
+ "name": "basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Value of the user's omsWorkspaceId",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"parameters('omsWorkspaceId')\""
+ }
+ },
+ {
+ "name": "(opsInsightWorkspaceKey)",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "Encrypted value of the user's omsWorkspaceKey",
+ "isEncrypted": 1,
+ "type": "string",
+ "value": "\"parameters('omsWorkspaceKey')\""
+ }
+ },
+ {
+ "name": "AzureVMInventory-AzureAutomationAccount-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the Automation Account",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"GEN-UNIQUE-30\""
+ }
+ },
+ {
+ "name": "AzureVMInventory-AzureAutomationResourceGroup-MS-Mgmt",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"', resourceGroup().name, '\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).ingestParentRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHT_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestParentRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestParentRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestParentRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(runbooks).ingestSchedulerRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/variables/AzureVMInventory-OPSINSIGHT_WS_KEY"
+ ],
+ "tags": {},
+ "properties": {
+ "runbookType": "(runbooks).ingestSchedulerRunbook.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).ingestSchedulerRunbook.description",
+ "publishContentLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution/scripts/AzureVMInventory-Schedules-MS-Mgmt.ps1 parameters('_artifactsLocationSasToken')",
+ "version": "(runbooks).ingestSchedulerRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/ingestscheduleName-[newGuid()]",
+ "type": "microsoft.automation/automationAccounts/schedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "description": "OMS Ingestion API Scheduler",
+ "startTime": "",
+ "isEnabled": "true",
+ "interval": "1",
+ "frequency": "hour"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/[newGuid()]",
+ "type": "microsoft.automation/automationAccounts/jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/schedules/ingestscheduleName-[newGuid()]",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30"
+ ],
+ "tags": {},
+ "properties": {
+ "schedule": {
+ "name": "ingestscheduleName-[newGuid()]"
+ },
+ "runbook": {
+ "name": "(Runbooks).ingestSchedulerRunbook.name"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-30/[newGuid()]",
+ "type": "Microsoft.Automation/automationAccounts/jobs",
+ "apiVersion": "2015-10-31",
+ "location": "eastus2",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestSchedulerRunbook.name",
+ "Microsoft.Automation/automationAccounts/GEN-UNIQUE-30/runbooks/(runbooks).ingestParentRunbook.name"
+ ],
+ "tags": {},
+ "properties": {
+ "runbook": {
+ "name": "(runbooks).ingestSchedulerRunbook.name"
+ },
+ "parameters": {
+ "frequency": 30,
+ "getNICandNSG": "1",
+ "getDiskInfo": "1",
+ "clearLocks": "1"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT761 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT761
new file mode 100644
index 0000000..7aa3414
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT761
@@ -0,0 +1,1315 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azure-vminventory-solution/azuredeployonlyloganalytics.json",
+ "/demos/oms-azure-vminventory-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900823,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azure-vminventory-solution/azuredeployonlyloganalytics.json",
+ "/demos/oms-azure-vminventory-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT761",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules",
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules/actions",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/savedsearches",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT761",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsLogAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Create new or use an existing Log Analytic Workspace"
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "omsLogAnalyticsRegion": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "southeastasia",
+ "Australia Southeast",
+ "wescentralus"
+ ],
+ "metadata": {
+ "description": "Specify the Azure Region for your new or existing Log Analytics workspace"
+ },
+ "value": "eastus"
+ },
+ "omsLogAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Specify the SKU for Log Analytics"
+ },
+ "value": "standalone"
+ },
+ "omsDataIngestionFrequency": {
+ "type": "int",
+ "defaultValue": 30,
+ "allowedValues": [
+ 15,
+ 30,
+ 60
+ ],
+ "metadata": {
+ "description": "Specify the Azure VM Inventory retrieval frequency"
+ },
+ "value": 30
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ },
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-azure-vminventory-solution"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ },
+ "omsAutomationAccountName": {
+ "value": "GEN-UNIQUE-30"
+ },
+ "omsAutomationRegion": {
+ "value": "eastus2"
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure VM Inventory",
+ "solutionName": "[concat('AzureVMInventory', '[', parameters('omsLogAnalyticsWorkspaceName'), ']')]",
+ "publisher": "volkanc@microsoft.com",
+ "displayName": "Azure VM Inventory",
+ "description": "Monitor Azure VMs deployed across subscriptions",
+ "author": "volkanc@microsoft.com"
+ }
+ },
+ "opsInsightWorkspaceID": "AzureVMInventory-OPSINSIGHTS_WS_ID",
+ "opsInsightWorkspaceIDType": "string",
+ "opsInsightWorkspaceIDDescription": "Value of the user's omsWorkspaceId",
+ "opsInsightWorkspaceKey": "AzureVMInventory-OPSINSIGHT_WS_KEY",
+ "opsInsightWorkspaceKeyType": "string",
+ "opsInsightWorkspaceKeyDescription": "Encrypted value of the user's omsWorkspaceKey",
+ "createScheduleAutomationAccountName": "AzureVMInventory-AzureAutomationAccount-MS-Mgmt",
+ "createScheduleAutomationAccountType": "string",
+ "createScheduleAutomationAccountDescription": "The name of the Automation Account",
+ "createScheduleResourceGroupName": "AzureVMInventory-AzureAutomationResourceGroup-MS-Mgmt",
+ "createScheduleResourceGroupType": "string",
+ "createScheduleResourceGroupDescription": "The name of the resource group",
+ "alertArray": [
+ {
+ "searchName": "Azure VMs in Stopped State ",
+ "description": "Azure VMs which shutdown from within operating system will continue incurring charges. Stop the VM from the portal to prevent unnecessary consumption.",
+ "severity": "Warning",
+ "query": "Type=AzureVMInventory_CL MetricName_s=VMInventory Status_s=Stopped | measure countdistinct(ID_s) by AzureSubscription_s,VmName_s",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure VM Inventory",
+ "scheduleIntervalInMinutes": 15,
+ "scheduleQueryTimeSpan": 15,
+ "alertName": "Azure VM Stopped State"
+ },
+ {
+ "searchName": "Azure Quota Usage",
+ "description": "Each Azure Subscription has quotas for VM cores per region. If the quota is reached new VMs annot be created",
+ "severity": "Critical",
+ "query": "Type=AzureVMInventory_CL MetricName_s=ARMVMUsageStats | EXTEND div(product(currentValue_d,100),limit_d) as UsedPct | Measure Max(UsedPct) by Location_s,Usagemetric_s | where AggregatedValue >90",
+ "alertTresholdValue": 0,
+ "operator": "gt",
+ "alertThrottleInMinutes": 60,
+ "alertBreach": 1,
+ "searchCategory": "Azure VM Inventory",
+ "scheduleIntervalInMinutes": 60,
+ "scheduleQueryTimeSpan": 60,
+ "alertName": "Azure Quota Usage Reached 90% of the Subscription Quota"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-20",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "properties": {
+ "sku": {
+ "name": "standalone"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.name",
+ "dependsOn": [
+ "[Concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'))]"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "DisplayName": "(omsSolutions).customSolution.displayName",
+ "Description": "(omsSolutions).customSolution.description",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Subscription",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "VM Count",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(ID_s) by AzureSubscription_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#9b4f96",
+ "#00d8cc",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(ID_s) by AzureSubscription_s,Status_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Size",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Size",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by HWProfile_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#fcd116",
+ "#7fba00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by HWProfile_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "VMSIZE",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Location",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Location",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Location_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#ff8c00",
+ "#eb3c00"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Location_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Location",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM by Deployement Type",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Classic vs ARM",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by DeploymentType_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#55d455",
+ "#ff8c00",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(ID_s) by AzureSubscription_s,DeploymentType_s,OperatingSystem_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "VMCount",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartCalloutBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM Status",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Status_s interval 30Minutes",
+ "Callout": {
+ "Title": "Running",
+ "Series": "Running",
+ "Operation": "Last Sample"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory Status_s=Running | measure countdistinct(VmName_s) by HWProfile_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Size",
+ "Value": "RuningVM"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "NumberTileListBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "TAGGED VMs",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(Tag_s) by AzureSubscription_s",
+ "Legend": "Tagged VM Count"
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory |measure countdistinct(VmName_s) by Tag_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMs by Subnet",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Subnets",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNIC | measure countdistinct(VmName_s) by subnet_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNIC | measure countdistinct(VmName_s) by AzureSubscription_s,subnet_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "InputEndpoints ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "No of VMs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMEndpoint | measure countdistinct(VmName_s) by endpointName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMEndpoint | measure countdistinct(VmName_s) by endpointName_s,privatePort_d",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "EndpointName",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "NSG Rules Applied",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "No of VMs",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule | measure countdistinct(VmName_s) by RuleName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#fcd116",
+ "#0072c6",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule | measure countdistinct(VmName_s) by RuleName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Rule",
+ "Value": "CountVM"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "NSG - Allowed Ports ",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Count of Computers",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule access_s=Allow | measure countdistinct(VmName_s) by destinationPortRange_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#7fba00",
+ "#fcd116"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMNSGrule access_s=Allow | measure countdistinct(VmName_s) by sourcePortRange_s,destinationPortRange_s,protocol_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Source",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Cores Utilized",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Per Region",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=ARMVMUsageStats TimeGenerated>NOW-30Minutes Usagemetric_s=cores |measure max(currentValue_d) by Location_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=ARMVMUsageStats TimeGenerated>NOW-30Minutes Usagemetric_s=cores |measure max(currentValue_d) by AzureSubscription_sLocation_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Subscription",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Disk Count by IO",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "MAX DISK IO",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by MaxDiskIO_d",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by DiskIOType_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "IOTYPE",
+ "Value": "DiskCount"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Disks by Storage Account",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by StorageAccount_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#0072c6",
+ "#ffb900",
+ "#55d455"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMDisk | measure countdistinct(VHDUri_s) by StorageAccount_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "StorageAccount",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "SingleQueryDonutBuilderBladeV1",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VM Extensions Inventory",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Extension Count",
+ "Subtitle": ""
+ },
+ "Donut": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMExtensions | measure countdistinct(VmName_s) by Extension_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00bcf2",
+ "#ffb900",
+ "#009e49"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMExtensions | measure countdistinct(VmName_s) by Extension_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Extension",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartCalloutBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "LineChart": {
+ "Query": "Type=AzureVMInventory_CL MetricName_s=VMInventory | measure countdistinct(VmName_s) by Status_s interval 30Minutes",
+ "Callout": {
+ "Title": "Running",
+ "Series": "Running",
+ "Operation": "Last Sample"
+ },
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*",
+ "Message": ""
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.name"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": true
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": true
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20/views/(omsSolutions).customSolution.name",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsLogAnalyticsWorkspaceName'), '/savedSearches/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT762 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT762
new file mode 100644
index 0000000..410246d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT762
@@ -0,0 +1,429 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-azurensg-solution/azuredeploy.json",
+ "/demos/oms-azurensg-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900832,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-azurensg-solution/azuredeploy.json",
+ "/demos/oms-azurensg-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT762",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT762",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the workspace name"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specify the workspace region"
+ }
+ },
+ "LineChartBuilderBladeId": {
+ "type": "string",
+ "defaultValue": "LineChartBuilderBlade",
+ "metadata": {
+ "description": "Line Chart Builder Blade Id"
+ }
+ },
+ "NotableQueriesBuilderBladeId": {
+ "type": "string",
+ "defaultValue": "NotableQueriesBuilderBlade",
+ "metadata": {
+ "description": "Notable Queries Builder Blade Id"
+ }
+ },
+ "LineChartBuilderTileId": {
+ "type": "string",
+ "defaultValue": "LineChartBuilderTile",
+ "metadata": {
+ "description": "Line Chart Builder Tile Id"
+ }
+ },
+ "LineChartBuilderBladetabGroupId1": {
+ "type": "int",
+ "defaultValue": 1528570627308
+ },
+ "LineChartBuilderBladetabGroupId2": {
+ "type": "int",
+ "defaultValue": 1528570627318
+ },
+ "NotableQueriesBuilderBladetabGroupId1": {
+ "type": "int",
+ "defaultValue": 1528570627315
+ },
+ "NotableQueriesBuilderBladetabGroupId2": {
+ "type": "int",
+ "defaultValue": 1528570627320
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure Network Security Group Analytics",
+ "solutionName": "[concat('AzureNSGAnalytics', '[', parameters('workspaceName'), ']')]",
+ "publisher": "Microsoft",
+ "displayName": "Azure Network Security Group Analytics",
+ "description": "Gain insight into your Azure Network Security Group logs",
+ "author": "Microsoft"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-10-01",
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "[resourceGroup().location]",
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "Azure Network Security Group Analytics",
+ "type": "views",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Version": 2,
+ "Dashboard": [
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Network Security Group Blocked Flows",
+ "newGroup": true,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Rules with blocked flows"
+ },
+ "LineChart": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"block\" | summarize AggregatedValue = sum(matchedConnections_d) by ruleName_s , bin(TimeGenerated, 1h)| where AggregatedValue >0 |render timechart",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"block\" | summarize AggregatedValue = sum(matchedConnections_d) by ruleName_s | where AggregatedValue > 0",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "ColumnsTitle": {
+ "Name": "Rule",
+ "Value": "Blocked Flows Last Hour"
+ },
+ "Color": "#0072c6",
+ "operation": "Last Sample",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc",
+ "NavigationSelect": {
+ "NavigationQuery": "search {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "newGroup": false,
+ "useIcon": false,
+ "tabGroupId": 1528570627308
+ },
+ "Header": {
+ "Title": "MAC Addresses with Blocked Flows"
+ },
+ "LineChart": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"block\" | summarize AggregatedValue = sum(matchedConnections_d) by subnetPrefix_s, bin(TimeGenerated, 1h)| render timechart",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"block\" | summarize AggregatedValue = sum(matchedConnections_d) by subnetPrefix_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Last Sample",
+ "ColumnsTitle": {
+ "Name": "MAC Address",
+ "Value": "Blocked Flows Last Hour"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "search in (AzureDiagnostics) ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Network Security Group Allowed Flows",
+ "newGroup": true,
+ "useIcon": false,
+ "tabGroupId": 1528570627315
+ },
+ "Header": {
+ "Title": "Rules with Allowed Flows"
+ },
+ "LineChart": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"allow\" | summarize AggregatedValue = sum(matchedConnections_d) by ruleName_s, bin(TimeGenerated, 1h) | where AggregatedValue > 0| render timechart",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"allow\" | summarize AggregatedValue = sum(matchedConnections_d) by ruleName_s| where AggregatedValue > 0",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Last Sample",
+ "ColumnsTitle": {
+ "Name": "Rule",
+ "Value": "Allowed Flows Last Hour"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "search in (AzureDiagnostics) ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "newGroup": false,
+ "useIcon": false,
+ "tabGroupId": 1528570627318
+ },
+ "Header": {
+ "Title": "MAC Addresses with Allowed Flows"
+ },
+ "LineChart": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"allow\" | summarize AggregatedValue = sum(matchedConnections_d) by subnetPrefix_s, bin(TimeGenerated, 1h) | render timechart",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and type_s == \"block\" | summarize AggregatedValue = sum(matchedConnections_d) by subnetPrefix_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Last Sample",
+ "ColumnsTitle": {
+ "Name": "MAC Address",
+ "Value": "Allowed Flows Last Hour"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "search in (AzureDiagnostics) ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" and {selected item} | sort by TimeGenerated desc"
+ }
+ }
+ },
+ {
+ "Id": "NotableQueriesBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Recommended Searches",
+ "newGroup": true,
+ "preselectedFilters": "Type, Computer",
+ "renderMode": "grid",
+ "tabGroupId": 1528570627320
+ },
+ "queries": [
+ {
+ "query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupEvent\" | sort by TimeGenerated desc",
+ "displayName": "Azure Network Security Group Events"
+ },
+ {
+ "query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" | sort by TimeGenerated desc",
+ "displayName": "Azure Network Security Group Counter Events"
+ },
+ {
+ "query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupEvent\" and ruleName_s !in ((union * | where Category == \"NetworkSecurityGroupRuleCounter\" and matchedConnections_d > 0 | distinct ruleName_s)) | summarize arg_max(TimeGenerated, *) by ruleName_s | sort by TimeGenerated desc | project TimeGenerated, ruleName_s, type_s, direction_s",
+ "displayName": "Azure Network Security Group Rules Not Matching Any Flows"
+ },
+ {
+ "query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupEvent\" and ruleName_s in ((union * | where Category == \"NetworkSecurityGroupRuleCounter\" and matchedConnections_d > 0 | distinct ruleName_s)) | summarize arg_max(TimeGenerated, *) by ruleName_s | sort by TimeGenerated desc | project TimeGenerated, ruleName_s, type_s, direction_s",
+ "displayName": "Azure Network Security Group Rules Matching Flows"
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "LineChartBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 2,
+ "Configuration": {
+ "LineChart": {
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" and Category == \"NetworkSecurityGroupRuleCounter\" | summarize AggregatedValue = sum(matchedConnections_d) by type_s | where AggregatedValue > 0",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": true,
+ "Query": "AzureDiagnostics | where ResourceType == \"NETWORKSECURITYGROUPS\" | sort by TimeGenerated desc",
+ "Message": "Learn how to configure solution: http://go.microsoft.com/fwlink/?linkid=839623"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-10/(omsSolutions).customSolution.Name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT763 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT763
new file mode 100644
index 0000000..2c5fcf6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT763
@@ -0,0 +1,6537 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsAlerts.json"
+ ],
+ "timestamp": 1642962900842,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsAlerts.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT763",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules",
+ "microsoft.operationalinsights/workspaces/savedsearches/schedules/actions",
+ "microsoft.operationalinsights/workspaces/savedsearches"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT763",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Input the name of your OMS Workspace"
+ }
+ },
+ "actionGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the action group for alert actions"
+ }
+ }
+ },
+ "variables": {
+ "alerts": [
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerLRPAuctionsFailed.critical",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerLRPAuctionsFailed\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | summarize avg(sum_Delta_d) by Environment_s | where avg_sum_Delta_d >= 1"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer App Instance (AI) Placement Failures",
+ "description": "The number of Long Running Process (LRP) instances that the auctioneer failed to place on Diego cells. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerLRPAuctionsFailed",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 5,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerLRPAuctionsFailed.warning",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerLRPAuctionsFailed\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | summarize avg(sum_Delta_d) by Environment_s | where avg_sum_Delta_d >= 0.5"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer App Instance (AI) Placement Failures",
+ "description": "The number of Long Running Process (LRP) instances that the auctioneer failed to place on Diego cells. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerLRPAuctionsFailed",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 2.5,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerFetchStatesDuration.critical",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerFetchStatesDuration\" | where Value_d >= 5000000000"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer Time to Fetch Cell State",
+ "description": "Time in ns that the auctioneer took to fetch state from all the Diego cells when running its auction. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerFetchStatesDuration",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerFetchStatesDuration.warning",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerFetchStatesDuration\" | where Value_d >= 2000000000"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer Time to Fetch Cell State",
+ "description": "Time in ns that the auctioneer took to fetch state from all the Diego cells when running its auction. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerFetchStatesDuration",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerLRPAuctionsStarted.critical",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerLRPAuctionsStarted\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | summarize avg(sum_Delta_d) by Environment_s | where avg_sum_Delta_d > 20"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer App Instance Starts",
+ "description": "The number of LRP instances that the auctioneer successfully placed on Diego cells. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerLRPAuctionsStarted",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerLRPAuctionsStarted.warning",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerLRPAuctionsStarted\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | summarize avg(sum_Delta_d) by Environment_s | where avg_sum_Delta_d > 10"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer App Instance Starts",
+ "description": "The number of LRP instances that the auctioneer successfully placed on Diego cells. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerLRPAuctionsStarted",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerTaskAuctionsFailed.critical",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerTaskAuctionsFailed\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | summarize avg(sum_Delta_d) by Environment_s | where avg_sum_Delta_d >= 1"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer Task Placement Failures",
+ "description": "The number of Tasks that the auctioneer failed to place on Diego cells. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerTaskAuctionsFailed",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.auctioneer.AuctioneerTaskAuctionsFailed.warning",
+ "category": "CF-DiegoAuctioneer-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerTaskAuctionsFailed\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | summarize avg(sum_Delta_d) by Environment_s | where avg_sum_Delta_d >= 0.5"
+ },
+ "alert": {
+ "displayName": "CF-Auctioneer Task Placement Failures",
+ "description": "The number of Tasks that the auctioneer failed to place on Diego cells. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#AuctioneerTaskAuctionsFailed",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.ConvergenceLRPDuration.critical",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"ConvergenceLRPDuration\" | where Value_d >= 20000000000"
+ },
+ "alert": {
+ "displayName": "CF-BBS Time to Run LRP Convergence",
+ "description": "Time in ns that the BBS took to run its LRP convergence pass. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#ConvergenceLRPDuration",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.ConvergenceLRPDuration.warning",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"ConvergenceLRPDuration\" | where Value_d >= 10000000000"
+ },
+ "alert": {
+ "displayName": "CF-BBS Time to Run LRP Convergence",
+ "description": "Time in ns that the BBS took to run its LRP convergence pass. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#ConvergenceLRPDuration",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.RequestLatency.critical",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"RequestLatency\" | summarize avg(Value_d) by Environment_s | where avg_Value_d >= 10000000000"
+ },
+ "alert": {
+ "displayName": "CF-BBS Time to Handle Requests",
+ "description": "Time in ns that the BBS took to handle requests, aggregated across all its API endpoints. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#RequestLatency",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.RequestLatency.warning",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"RequestLatency\" | summarize avg(Value_d) by Environment_s | where avg_Value_d >= 5000000000"
+ },
+ "alert": {
+ "displayName": "CF-BBS Time to Handle Requests",
+ "description": "Time in ns that the BBS took to handle requests, aggregated across all its API endpoints. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#RequestLatency",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.Domain.cf-apps.critical",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"Domain.cf-apps\" | summarize avg(Value_d) by Environment_s | where avg_Value_d < 1"
+ },
+ "alert": {
+ "displayName": "CF-Cloud Controller and Diego in Sync",
+ "description": "Indicates if the cf-apps Domain is up-to-date, meaning that CF App requests from Cloud Controller are synchronized to bbs.LRPsDesired (Diego-desired AIs) for execution. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#cc-diego-sync",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.LRPsExtra.critical",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsExtra\" | summarize avg(Value_d) by Environment_s | where avg_Value_d >= 10"
+ },
+ "alert": {
+ "displayName": "CF-More App Instances Than Expected",
+ "description": "Total number of LRP instances that are no longer desired but still have a BBS record. When Diego wants to add more apps, the BBS sends a request to the auctioneer to spin up additional LRPs. LRPsExtra is the total number of LRP instances that are no longer desired but still have a BBS record. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#LRPsExtra",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.LRPsExtra.warning",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsExtra\" | summarize avg(Value_d) by Environment_s | where avg_Value_d >= 5"
+ },
+ "alert": {
+ "displayName": "CF-More App Instances Than Expected",
+ "description": "Total number of LRP instances that are no longer desired but still have a BBS record. When Diego wants to add more apps, the BBS sends a request to the auctioneer to spin up additional LRPs. LRPsExtra is the total number of LRP instances that are no longer desired but still have a BBS record. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#LRPsExtra",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.LRPsMissing.critical",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsMissing\" | summarize avg(Value_d) by Environment_s | where avg_Value_d >= 10"
+ },
+ "alert": {
+ "displayName": "CF-Fewer App Instances Than Expected",
+ "description": "Total number of LRP instances that are desired but have no record in the BBS. When Diego wants to add more apps, the BBS sends a request to the auctioneer to spin up additional LRPs. LRPsMissing is the total number of LRP instances that are desired but have no BBS record. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#LRPsMissing",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.LRPsMissing.warning",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsMissing\" | summarize avg(Value_d) by Environment_s | where avg_Value_d >= 5"
+ },
+ "alert": {
+ "displayName": "CF-Fewer App Instances Than Expected",
+ "description": "Total number of LRP instances that are desired but have no record in the BBS. When Diego wants to add more apps, the BBS sends a request to the auctioneer to spin up additional LRPs. LRPsMissing is the total number of LRP instances that are desired but have no BBS record. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#LRPsMissing",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.CrashedActualLRPs.critical",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"CrashedActualLRPs\" | where Value_d > 2"
+ },
+ "alert": {
+ "displayName": "CF-Crashed App Instances",
+ "description": "Total number of LRP instances that have crashed. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#bbs.CrashedActualLRPs",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.CrashedActualLRPs.warning",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"CrashedActualLRPs\" | where Value_d > 0"
+ },
+ "alert": {
+ "displayName": "CF-Crashed App Instances",
+ "description": "Total number of LRP instances that have crashed. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#bbs.CrashedActualLRPs",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.LRPsRunning.critical",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "let T1 = CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsRunning\" and EventTime_t > ago(1h) | summarize CurrentHourAverage = avg(Value_d) by Environment_s;\nlet T2 = CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsRunning\" and EventTime_t > ago(2h) and EventTime_t < ago(1h) | summarize PreviousHourAverage = avg(Value_d) by Environment_s;\n T1 | join (T2) on Environment_s | where abs(CurrentHourAverage-PreviousHourAverage) > 20"
+ },
+ "alert": {
+ "displayName": "CF-Running App Instances, Rate of Change",
+ "description": "Rate of change in app instances being started or stopped on the platform. We use changes on GoRouter to detect this metric. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#1hraverageofbbs.LRPsRunning",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 30,
+ "timeSpan": 120
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.bbs.LRPsRunning.warning",
+ "category": "CF-DiegoBBS-KPI",
+ "query": "let T1 = CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsRunning\" and EventTime_t > ago(1h) | summarize CurrentHourAverage = avg(Value_d) by Environment_s;\nlet T2 = CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"LRPsRunning\" and EventTime_t > ago(2h) and EventTime_t < ago(1h) | summarize PreviousHourAverage = avg(Value_d) by Environment_s;\n T1 | join (T2) on Environment_s | where abs(CurrentHourAverage-PreviousHourAverage) > 10"
+ },
+ "alert": {
+ "displayName": "CF-Running App Instances, Rate of Change",
+ "description": "Rate of change in app instances being started or stopped on the platform. We use changes on GoRouter to detect this metric. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#1hraverageofbbs.LRPsRunning",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 30,
+ "timeSpan": 120
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.rep.CapacityRemainingMemory.critical",
+ "category": "CF-DiegoCell-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"CapacityRemainingMemory\" and Value_d <= 32678"
+ },
+ "alert": {
+ "displayName": "CF-Overall Remaining Memory Available",
+ "description": "Remaining amount of memory in MiB available for this Diego cell to allocate to containers. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#rep.CapacityRemainingMemory2",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.rep.CapacityRemainingMemory.warning",
+ "category": "CF-DiegoCell-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"CapacityRemainingMemory\" and Value_d <= 65536"
+ },
+ "alert": {
+ "displayName": "CF-Overall Remaining Memory Available",
+ "description": "Remaining amount of memory in MiB available for this Diego cell to allocate to containers. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#rep.CapacityRemainingMemory2",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.rep.CapacityRemainingDisk.critical",
+ "category": "CF-DiegoCell-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"CapacityRemainingDisk\" and Value_d <= 3584"
+ },
+ "alert": {
+ "displayName": "CF-Remaining Disk Available",
+ "description": "Remaining amount of disk in MiB available for this Diego cell to allocate to containers. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#CapacityRemainingDisk",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.rep.CapacityRemainingDisk.warning",
+ "category": "CF-DiegoCell-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"CapacityRemainingDisk\" and Value_d <= 8192"
+ },
+ "alert": {
+ "displayName": "CF-Remaining Disk Available",
+ "description": "Remaining amount of disk in MiB available for this Diego cell to allocate to containers. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#CapacityRemainingDisk",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.rep.RepBulkSyncDuration.critical",
+ "category": "CF-DiegoCell-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"RepBulkSyncDuration\" and Value_d >= 10000000000"
+ },
+ "alert": {
+ "displayName": "CF-Cell Rep Time to Sync",
+ "description": "Time in ns that the Diego Cell Rep took to sync the ActualLRPs that it claimed with its actual garden containers. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#RepBulkSyncDuration",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.rep.RepBulkSyncDuration.warning",
+ "category": "CF-DiegoCell-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"RepBulkSyncDuration\" and Value_d >= 5000000000"
+ },
+ "alert": {
+ "displayName": "CF-Cell Rep Time to Sync",
+ "description": "Time in ns that the Diego Cell Rep took to sync the ActualLRPs that it claimed with its actual garden containers. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#RepBulkSyncDuration",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.rep.UnhealthyCell.critical",
+ "category": "CF-DiegoCell-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"UnhealthyCell\" and Value_d != 0 | summarize count() by Environment_s"
+ },
+ "alert": {
+ "displayName": "CF-Unhealthy Cells",
+ "description": "The Diego cell periodically checks its health against the garden backend. For Diego cells, 0 means healthy, and 1 means unhealthy. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#UnhealthyCell",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 1,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.locket.ActiveLocks.critical",
+ "category": "CF-DiegoLocket-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"locket\" and Name_s == \"ActiveLocks\" | summarize max(Value_d) by Environment_s | where max_Value_d != 4"
+ },
+ "alert": {
+ "displayName": "CF-Active Locks",
+ "description": "Total count of how many locks the system components are holding. As of PCF v1.11, the BBS, Auctioneer, TPS Watcher, and Routing API components have migrated to Locket from Consul lock. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#ActiveLocks",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.locket.ActivePresences.critical",
+ "category": "CF-DiegoLocket-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"locket\" and Name_s == \"ActivePresences\" | where Value_d > 25"
+ },
+ "alert": {
+ "displayName": "CF-Active Presences",
+ "description": "Total count of active presences. Presences are defined as the registration records that the cells maintain to advertise themselves to the platform. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#ActivePresences",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.locket.ActivePresences.warning",
+ "category": "CF-DiegoLocket-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"locket\" and Name_s == \"ActivePresences\" | where Value_d > 10"
+ },
+ "alert": {
+ "displayName": "CF-Active Presences",
+ "description": "Total count of active presences. Presences are defined as the registration records that the cells maintain to advertise themselves to the platform. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#ActivePresences",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.route_emitter.RouteEmitterSyncDuration.critical",
+ "category": "CF-RouteEmitter-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"route_emitter\" and Name_s == \"RouteEmitterSyncDuration\" | summarize AggregatedValue = max(Value_d) by Job_s | where AggregatedValue > 10000000000"
+ },
+ "alert": {
+ "displayName": "CF-Route Emitter Time to Sync",
+ "description": "Time in ns that the active route-emitter took to perform its synchronization pass. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#RouteEmitterSyncDuration",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.route_emitter.RouteEmitterSyncDuration.warning",
+ "category": "CF-RouteEmitter-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"route_emitter\" and Name_s == \"RouteEmitterSyncDuration\" | summarize AggregatedValue = max(Value_d) by Job_s | where AggregatedValue > 5000000000"
+ },
+ "alert": {
+ "displayName": "CF-Route Emitter Time to Sync",
+ "description": "Time in ns that the active route-emitter took to perform its synchronization pass. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#RouteEmitterSyncDuration",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 15
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.availability.critical",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/available\" and Value_d < 1"
+ },
+ "alert": {
+ "displayName": "CF-MySQL Server Availability",
+ "description": "The MySQL Server is currently responding to requests, which indicates that the server is running. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-mysql-server-availability",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.galera.wsrep_ready.critical",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/galera/wsrep_ready\" | summarize avg(Value_d) by Environment_s, SourceInstance_s | where avg_Value_d == 0"
+ },
+ "alert": {
+ "displayName": "CF-Galera Cluster Node Readiness",
+ "description": "Shows whether each cluster node can accept queries. Returns only 0 or 1. When this metric is 0, almost all queries to that node fail with the error:ERROR 1047 (08501) Unknown Command. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-galera-cluster-node-readiness",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.galera.wsrep_ready.warning",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/galera/wsrep_ready\" | summarize avg(Value_d) by Environment_s, SourceInstance_s | where avg_Value_d < 1"
+ },
+ "alert": {
+ "displayName": "CF-Galera Cluster Node Readiness",
+ "description": "Shows whether each cluster node can accept queries. Returns only 0 or 1. When this metric is 0, almost all queries to that node fail with the error:ERROR 1047 (08501) Unknown Command. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-galera-cluster-node-readiness",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "_comment": "Not exactly the same as instruction, as instructed (Average of the values of each node / cluster size) should always be 1",
+ "search": {
+ "name": "cf.mysql.galera.wsrep_cluster_size.critical",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/galera/wsrep_cluster_size\" | summarize avg(Value_d) by Environment_s, SourceInstance_s | where avg_Value_d < 1"
+ },
+ "alert": {
+ "displayName": "CF-Galera Cluster Size",
+ "description": "The number of cluster nodes with which each node is communicating normally. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-galera-cluster-size",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "_comment": "Not exactly the same as instruction, as instructed (Average of the values of each node / cluster size) should always be 1",
+ "search": {
+ "name": "cf.mysql.galera.wsrep_cluster_size.warning",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/galera/wsrep_cluster_size\" | summarize avg(Value_d) by Environment_s, SourceInstance_s | where avg_Value_d < 3"
+ },
+ "alert": {
+ "displayName": "CF-Galera Cluster Size",
+ "description": "The number of cluster nodes with which each node is communicating normally. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-galera-cluster-size",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.galera.wsrep_cluster_status.critical",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/galera/wsrep_cluster_status\" | summarize argmax(EventTime_t, Value_d) by Environment_s, SourceInstance_s | summarize sum(max_EventTime_t_Value_d) by Environment_s | where sum_max_EventTime_t_Value_d < 1"
+ },
+ "alert": {
+ "displayName": "CF-Galera Cluster Status",
+ "description": "Shows the primary status of the cluster component that the node is in. Values are 1 for Primary, 0 for Non-primary, -1 for Disconnected. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-galera-cluster-status",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.galera.wsrep_cluster_status.warning",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/galera/wsrep_cluster_status\" | summarize argmax(EventTime_t, Value_d) by Environment_s, SourceInstance_s | summarize sum(max_EventTime_t_Value_d) by Environment_s | where sum_max_EventTime_t_Value_d < 3"
+ },
+ "alert": {
+ "displayName": "CF-Galera Cluster Status",
+ "description": "Shows the primary status of the cluster component that the node is in. Values are 1 for Primary, 0 for Non-primary, -1 for Disconnected. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-galera-cluster-status",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "_comment": "Use 5-minute timeSpan due to OMS minimum timespan limitation",
+ "search": {
+ "name": "cf.mysql.net.connections.critical",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/net/connections\" | summarize avg(Value_d), max(Value_d) by Environment_s | project Environment_s, avg_Value_d, max_Value_d, avg_ratio = avg_Value_d / max_Value_d | where avg_ratio > 0.9"
+ },
+ "alert": {
+ "displayName": "CF-Connections per Second",
+ "description": "Connections per second made to the server. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-connections-per-second",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "_comment": "Use 5-minute timeSpan due to OMS minimum timespan limitation",
+ "search": {
+ "name": "cf.mysql.net.connections.warning",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/net/connections\" | summarize avg(Value_d), max(Value_d) by Environment_s | project Environment_s, avg_Value_d, max_Value_d, avg_ratio = avg_Value_d / max_Value_d | where avg_ratio > 0.8"
+ },
+ "alert": {
+ "displayName": "CF-Connections per Second",
+ "description": "Connections per second made to the server. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-connections-per-second",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.performance.questions.critical",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/performance/questions\" | summarize avg(Value_d) by Environment_s, bin(EventTime_t, 120s) | where avg_Value_d == 0"
+ },
+ "alert": {
+ "displayName": "CF-Query Rate",
+ "description": "The rate of statements execute by the server, shown as queries per second. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-query-rate",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 6
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.performance.questions.warning",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/performance/questions\" | summarize avg(Value_d) by Environment_s, bin(EventTime_t, 90s) | where avg_Value_d == 0"
+ },
+ "alert": {
+ "displayName": "CF-Query Rate",
+ "description": "The rate of statements execute by the server, shown as queries per second. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-query-rate",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 6
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.performance.busy_time.critical",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/performance/busy_time\" | summarize avg(Value_d) by Environment_s, SourceInstance_s, bin(EventTime_t, 120s) | where avg_Value_d > 90"
+ },
+ "alert": {
+ "displayName": "CF-MySQL CPU Busy Time",
+ "description": "Percentage of CPU time spent by MySQL on user activity, executing user code, as opposed to kernel activity processing system calls. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-mysql-cpu-busy-time",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 6
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.mysql.performance.busy_time.warning",
+ "category": "CF-MySQL-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"mysql\" and Name_s == \"/mysql/performance/busy_time\" | summarize avg(Value_d) by Environment_s, SourceInstance_s, bin(EventTime_t, 120s) | where avg_Value_d > 80"
+ },
+ "alert": {
+ "displayName": "CF-MySQL CPU Busy Time",
+ "description": "Percentage of CPU time spent by MySQL on user activity, executing user code, as opposed to kernel activity processing system calls. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#-mysql-cpu-busy-time",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 6
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.file_descriptors.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"file_descriptors\" | summarize max(Value_d) by Environment_s, SourceInstance_s | where max_value_d > 60000"
+ },
+ "alert": {
+ "displayName": "CF-Router File Descriptors",
+ "description": "The number of file descriptors currently used by the Gorouter job. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#router-file-descriptors",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.file_descriptors.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"file_descriptors\" | summarize max(Value_d) by Environment_s, SourceInstance_s | where max_value_d > 50000"
+ },
+ "alert": {
+ "displayName": "CF-Router File Descriptors",
+ "description": "The number of file descriptors currently used by the Gorouter job. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#router-file-descriptors",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.backend_exhausted_conns.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"backend_exhausted_conns\" | summarize sum(Delta_d) by Environment_s, SourceInstance_s, bin(EventTime_t, 1m) | where sum_Delta_d > 10"
+ },
+ "alert": {
+ "displayName": "CF-Router Exhausted Connections",
+ "description": "The lifetime number of requests that have been rejected by the Gorouter VM due to the Max Connections Per Backend limit being reached across all tried backends. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#router-exhausted-connections",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.backend_exhausted_conns.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"backend_exhausted_conns\" | summarize sum(Delta_d) by Environment_s, SourceInstance_s, bin(EventTime_t, 1m) | where sum_Delta_d > 0"
+ },
+ "alert": {
+ "displayName": "CF-Router Exhausted Connections",
+ "description": "The lifetime number of requests that have been rejected by the Gorouter VM due to the Max Connections Per Backend limit being reached across all tried backends. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#router-exhausted-connections",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.total_requests.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"total_requests\" | summarize sum(Delta_d) by SourceInstance_s | where sum_Delta_d > 100000"
+ },
+ "alert": {
+ "displayName": "CF-Router Throughput",
+ "description": "The lifetime number of requests completed by the GoRouter VM. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#total_requests",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.total_requests.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"total_requests\" | summarize sum(Delta_d) by SourceInstance_s | where sum_Delta_d > 50000"
+ },
+ "alert": {
+ "displayName": "CF-Router Throughput",
+ "description": "The lifetime number of requests completed by the GoRouter VM. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#total_requests",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.latency.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"latency\" | summarize avg(Value_d) by SourceInstance_s | where avg_Value_d > 5000"
+ },
+ "alert": {
+ "displayName": "CF-Router Handling Latency",
+ "description": "The time in milliseconds that the GoRouter takes to handle requests to its app endpoints. This is the average round trip response time to an app, which includes router handling. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#latency",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.latency.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"latency\" | summarize avg(Value_d) by SourceInstance_s | where avg_Value_d > 3000"
+ },
+ "alert": {
+ "displayName": "CF-Router Handling Latency",
+ "description": "The time in milliseconds that the GoRouter takes to handle requests to its app endpoints. This is the average round trip response time to an app, which includes router handling. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#latency",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.ms_since_last_registry_update.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"ms_since_last_registry_update\" and Value_d >= 30000"
+ },
+ "alert": {
+ "displayName": "CF-Time Since Last Route Register Received",
+ "description": "Time in milliseconds since the last route register was received. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#mssincelastregistryupdate",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.bad_gateways.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"bad_gateways\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | where sum_Delta_d > 15"
+ },
+ "alert": {
+ "displayName": "CF-Router Error: 502 Bad Gateway",
+ "description": "The lifetime number of bad gateways, or 502 responses, from GoRouter itself. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#bad_gateways",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.bad_gateways.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"bad_gateways\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | where sum_Delta_d > 0"
+ },
+ "alert": {
+ "displayName": "CF-Router Error: 502 Bad Gateway",
+ "description": "The lifetime number of bad gateways, or 502 responses, from GoRouter itself. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#bad_gateways",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.responses.5xx.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"responses.5xx\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | where sum_Delta_d > 15"
+ },
+ "alert": {
+ "displayName": "CF-Router Error: Server Error",
+ "description": "The lifetime number of requests completed by the GoRouter VM for HTTP status family 5xx, server errors. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#responses.5xx",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.responses.5xx.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"responses.5xx\" | summarize sum(Delta_d) by Environment_s, bin(EventTime_t, 1m) | where sum_Delta_d > 0"
+ },
+ "alert": {
+ "displayName": "CF-Router Error: Server Error",
+ "description": "The lifetime number of requests completed by the GoRouter VM for HTTP status family 5xx, server errors. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#responses.5xx",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.total_routes.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "let T1 = CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"total_routes\" | summarize TotalRoutes = avg(Value_d) by Environment_s, bin(EventTime_t, 5m);\nlet T2 = T1 | project Environment_s, EventTime_t = EventTime_t-5m, TotalRoutesPrevious = TotalRoutes;\nT1 | join T2 on Environment_s, EventTime_t | project Environment_s, EventTime_t, TotalRoutes, TotalRoutesPrevious, TotalRoutesDelta = TotalRoutesPrevious - TotalRoutes | where TotalRoutesDelta > 20"
+ },
+ "alert": {
+ "displayName": "CF-Number of GoRouter Routes Registered",
+ "description": "The current total number of routes registered with the GoRouter. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#total_routes",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 10
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.total_routes.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "let T1 = CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"total_routes\" | summarize TotalRoutes = avg(Value_d) by Environment_s, bin(EventTime_t, 5m);\nlet T2 = T1 | project Environment_s, EventTime_t = EventTime_t-5m, TotalRoutesPrevious = TotalRoutes;\nT1 | join T2 on Environment_s, EventTime_t | project Environment_s, EventTime_t, TotalRoutes, TotalRoutesPrevious, TotalRoutesDelta = TotalRoutesPrevious - TotalRoutes | where TotalRoutesDelta > 10"
+ },
+ "alert": {
+ "displayName": "CF-Number of GoRouter Routes Registered",
+ "description": "The current total number of routes registered with the GoRouter. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#total_routes",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 10
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.registry_message.route-emitter.critical",
+ "category": "CF-GoRouter-KPI",
+ "query": "let T1 = CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"registry_message.route-emitter\" | summarize RegistryMessage = sum(Delta_d) by Environment_s;\nlet T2 = CF_CounterEvent_CL | where Origin_s == \"route_emitter\" and Name_s == \"MessagesEmitted\" | summarize MessagesEmitted = sum(Delta_d) by Environment_s;\nT1 | join T2 on Environment_s | project Environment_s, RegistryMessage, MessagesEmitted, MessageLost = RegistryMessage - MessagesEmitted | where MessageLost > 20"
+ },
+ "alert": {
+ "displayName": "CF-Number of Route Registration Messages Sent and Received",
+ "description": "The difference between the aggregate number of route registration messages published by all the Route Emitters and the number of messages received by each Gorouter instance. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#number-of-route-registration-messages-sent-and-received",
+ "severity": "Critical",
+ "enabled": "false",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.gorouter.registry_message.route-emitter.warning",
+ "category": "CF-GoRouter-KPI",
+ "query": "let T1 = CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s == \"registry_message.route-emitter\" | summarize RegistryMessage = sum(Delta_d) by Environment_s;\nlet T2 = CF_CounterEvent_CL | where Origin_s == \"route_emitter\" and Name_s == \"MessagesEmitted\" | summarize MessagesEmitted = sum(Delta_d) by Environment_s;\nT1 | join T2 on Environment_s | project Environment_s, RegistryMessage, MessagesEmitted, MessageLost = RegistryMessage - MessagesEmitted | where MessageLost > 0"
+ },
+ "alert": {
+ "displayName": "CF-Number of Route Registration Messages Sent and Received",
+ "description": "The difference between the aggregate number of route registration messages published by all the Route Emitters and the number of messages received by each Gorouter instance. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#number-of-route-registration-messages-sent-and-received",
+ "severity": "Warning",
+ "enabled": "false",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.DopplerServer.listeners.totalReceivedMessageCount.critical",
+ "category": "CF-Firehose-KPI",
+ "query": "CF_CounterEvent_CL | where (Origin_s == \"DopplerServer\" and Name_s == \"listeners.totalReceivedMessageCount\") or (Origin_s == \"loggregator.doppler\" and Name_s == \"ingress\") | summarize AveragePerMinute = sum(Delta_d) by Environment_s, bin(EventTime_t, 1min) | summarize MaximumPer5Minute = max(AveragePerMinute) by Environment_s | where MaximumPer5Minute > 20000"
+ },
+ "alert": {
+ "displayName": "CF-Firehose Throughput",
+ "description": "The total number of messages received across all Doppler listeners: UDP, TCP, TLS, and GRPC. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#listeners.receivedEnvelopes",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.DopplerServer.listeners.totalReceivedMessageCount.warning",
+ "category": "CF-Firehose-KPI",
+ "query": "CF_CounterEvent_CL | where (Origin_s == \"DopplerServer\" and Name_s == \"listeners.totalReceivedMessageCount\") or (Origin_s == \"loggregator.doppler\" and Name_s == \"ingress\") | summarize AveragePerMinute = sum(Delta_d) by Environment_s, bin(EventTime_t, 1min) | summarize MaximumPer5Minute = max(AveragePerMinute) by Environment_s | where MaximumPer5Minute > 15000"
+ },
+ "alert": {
+ "displayName": "CF-Firehose Throughput",
+ "description": "The total number of messages received across all Doppler listeners: UDP, TCP, TLS, and GRPC. This alert should have threshold settings based on scale and usage of your own CF deployment, please tuning its threshold in OMS settings if the default value is not suitable. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#listeners.receivedEnvelopes",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.DopplerServer.doppler.shedEnvelopes.critical",
+ "category": "CF-Firehose-KPI",
+ "query": "CF_CounterEvent_CL | where (Origin_s == \"DopplerServer\" and Name_s == \"doppler.shedEnvelopes\") or (Origin_s == \"loggregator.doppler\" and Name_s == \"dropped\") | summarize AveragePerMinute = sum(Delta_d) by Environment_s, bin(EventTime_t, 1min) | summarize MaximumPer5Minute = max(AveragePerMinute) by Environment_s | where MaximumPer5Minute > 5"
+ },
+ "alert": {
+ "displayName": "CF-Firehose Dropped Messages",
+ "description": "The lifetime total number of messages intentionally dropped by Doppler due to back pressure. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#deriveddopplerserver.doppler",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.DopplerServer.doppler.shedEnvelopes.warning",
+ "category": "CF-Firehose-KPI",
+ "query": "CF_CounterEvent_CL | where (Origin_s == \"DopplerServer\" and Name_s == \"doppler.shedEnvelopes\") or (Origin_s == \"loggregator.doppler\" and Name_s == \"dropped\") | summarize AveragePerMinute = sum(Delta_d) by Environment_s, bin(EventTime_t, 1min) | summarize MaximumPer5Minute = max(AveragePerMinute) by Environment_s | where MaximumPer5Minute > 0"
+ },
+ "alert": {
+ "displayName": "CF-Firehose Dropped Messages",
+ "description": "The lifetime total number of messages intentionally dropped by Doppler due to back pressure. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#deriveddopplerserver.doppler",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.healthy.critical",
+ "category": "CF-BOSH-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.healthy\" and Value_d < 1"
+ },
+ "alert": {
+ "displayName": "CF-VM Health",
+ "description": "The lifetime total number of messages intentionally dropped by Doppler due to back pressure. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#healthy",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.mem.percent.critical",
+ "category": "CF-BOSH-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.mem.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 90"
+ },
+ "alert": {
+ "displayName": "CF-VM Memory Used",
+ "description": "System Memory \u2014 Percentage of memory used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#mem.percent",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 10
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.mem.percent.warning",
+ "category": "CF-BOSH-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.mem.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 80"
+ },
+ "alert": {
+ "displayName": "CF-VM Memory Used",
+ "description": "System Memory \u2014 Percentage of memory used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#mem.percent",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 10
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.disk.system.percent.critical",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.disk.system.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 90"
+ },
+ "alert": {
+ "displayName": "CF-VM Disk Used",
+ "description": "System disk \u2014 Percentage of the system disk used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#disk.system.percent",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.disk.system.percent.warning",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.disk.system.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 80"
+ },
+ "alert": {
+ "displayName": "CF-VM Disk Used",
+ "description": "System disk \u2014 Percentage of the system disk used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#disk.system.percent",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.disk.ephemeral.percent.critical",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.disk.ephemeral.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 90"
+ },
+ "alert": {
+ "displayName": "CF-VM Ephemeral Disk Used",
+ "description": "Ephemeral disk \u2014 Percentage of the ephemeral disk used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#disk.ephemeral.percent",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.disk.ephemeral.percent.warning",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.disk.ephemeral.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 80"
+ },
+ "alert": {
+ "displayName": "CF-VM Ephemeral Disk Used",
+ "description": "Ephemeral disk \u2014 Percentage of the ephemeral disk used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#disk.ephemeral.percent",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.disk.persistent.percent.critical",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.disk.persistent.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 90"
+ },
+ "alert": {
+ "displayName": "CF-VM Persistent Disk Used",
+ "description": "Persistent disk \u2014 Percentage of persistent disk used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#disk.persistent.percent",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.disk.persistent.percent.warning",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.disk.persistent.percent\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 80"
+ },
+ "alert": {
+ "displayName": "CF-VM Persistent Disk Used",
+ "description": "Persistent disk \u2014 Percentage of persistent disk used on the VM. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#disk.persistent.percent",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 30
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.cpu.user.critical",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.cpu.user\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 95"
+ },
+ "alert": {
+ "displayName": "CF-VM CPU Utilization",
+ "description": "CPU utilization \u2014 The percentage of CPU spent in user processes. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#cpu.user",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.system.cpu.user.warning",
+ "category": "CF-System-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bosh-hm-forwarder\" or Origin_s == \"bosh-system-metrics-forwarder\" | where Name_s == \"system.cpu.user\" | summarize AggregatedValue = avg(Value_d) by SourceInstance_s | where AggregatedValue >= 85"
+ },
+ "alert": {
+ "displayName": "CF-VM CPU Utilization",
+ "description": "CPU utilization \u2014 The percentage of CPU spent in user processes. For details, please check https://docs.pivotal.io/pivotalcf/1-12/monitoring/kpi.html#cpu.user",
+ "severity": "Warning",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 5,
+ "timeSpan": 5
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.Consul is Down",
+ "category": "CF-Consul-KPI",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"route_emitter\" and Name_s == \"ConsulDownMode\" and Value_d > 0"
+ },
+ "alert": {
+ "displayName": "CF-Consul is Down",
+ "description": "Consul is Down",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 60
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.Problem in Logging Process",
+ "category": "CF-Loggregator-KPI",
+ "query": "CF_LogMessage_CL | where SourceType_s == \"LGR\" and MessageType_s == \"ERR\""
+ },
+ "alert": {
+ "displayName": "CF-Problem in Logging Process",
+ "description": "Loggregator emits LGR to indicate problems with the logging process",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 60
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.Slow Consumer Alert",
+ "category": "CF-Loggregator-KPI",
+ "query": "CF_ValueMetric_CL | where Name_s == \"slowConsumerAlert\""
+ },
+ "alert": {
+ "displayName": "CF-Slow Consumer Alert",
+ "description": "When the nozzle receives slow consumer alert from Loggregator, it sends slowConsumerAlert ValueMetric to OMS",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 60
+ },
+ "throttleMinutes": 60
+ }
+ },
+ {
+ "search": {
+ "name": "cf.Lost Events from Nozzle",
+ "category": "CF-OMS Nozzle-KPI",
+ "query": "CF_CounterEvent_CL | where Job_s == \"nozzle\" and Name_s == \"eventsLost\" and Delta_d > 0"
+ },
+ "alert": {
+ "displayName": "CF-Lost Events from Nozzle",
+ "description": "Lost Events from Nozzle",
+ "severity": "Critical",
+ "enabled": "true",
+ "thresholdOperator": "gt",
+ "thresholdValue": 0,
+ "schedule": {
+ "interval": 15,
+ "timeSpan": 60
+ },
+ "throttleMinutes": 60
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "properties": {
+ "etag": "*",
+ "query": "(alerts)[copyIndex()].search.query",
+ "displayName": "[concat(variables('alerts')[copyIndex()].search.name)]",
+ "category": "(alerts)[copyIndex()].search.category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {},
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "properties": {
+ "etag": "*",
+ "interval": "(alerts)[copyIndex()].alert.schedule.interval",
+ "queryTimeSpan": "(alerts)[copyIndex()].alert.schedule.timeSpan",
+ "enabled": "(alerts)[copyIndex()].alert.enabled"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/', 'schedule-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name), '/', 'alert-', uniqueString(resourceGroup().id, deployment().name, parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2017-03-15-preview",
+ "dependsOn": [
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name))]",
+ "[concat('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'), '/savedSearches/', toLower(variables('alerts')[copyIndex()].search.category), '|', toLower(variables('alerts')[copyIndex()].search.name), '/schedules/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsWorkspaceName'), '/', variables('alerts')[copyIndex()].search.category, '|', variables('alerts')[copyIndex()].search.name))]"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alerts)[copyIndex()].alert.displayName",
+ "Description": "(alerts)[copyIndex()].alert.description",
+ "Severity": "[toLower(variables('alerts')[copyIndex()].alert.severity)]",
+ "Threshold": {
+ "Operator": "(alerts)[copyIndex()].alert.thresholdOperator",
+ "Value": "(alerts)[copyIndex()].alert.thresholdValue"
+ },
+ "Throttling": {
+ "DurationInMinutes": "(alerts)[copyIndex()].alert.throttleMinutes"
+ },
+ "AzNsNotification": {
+ "GroupIds": [
+ "[concat(resourceGroup().id, '/providers/microsoft.insights/actiongroups/', parameters('actionGroupName'))]"
+ ],
+ "CustomEmailSubject": "[concat('[', toUpper(variables('alerts')[copyIndex()].alert.severity), '] ', variables('alerts')[copyIndex()].alert.displayName)]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT764 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT764
new file mode 100644
index 0000000..3c27c61
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT764
@@ -0,0 +1,1322 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsCustomViews.json"
+ ],
+ "timestamp": 1642962900885,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsCustomViews.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT764",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT764",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Input the name of your Log Analytic Workspace, a new workspace will be created if workspace with given name and location doesn't exist."
+ }
+ },
+ "omsWorkspaceRegion": {
+ "type": "string",
+ "defaultValue": "East US",
+ "allowedValues": [
+ "Australia Southeast",
+ "East US",
+ "Japan East",
+ "Southeast Asia",
+ "UK South",
+ "West Central US",
+ "West Europe",
+ "North Europe"
+ ],
+ "metadata": {
+ "description": "Specify the region for your Workspace"
+ }
+ },
+ "systemMetricsProvider": {
+ "type": "string",
+ "defaultValue": "BOSH Health Metrics Forwarder Only",
+ "allowedValues": [
+ "None",
+ "Microsoft Azure OMS Agent Only",
+ "BOSH Health Metrics Forwarder Only",
+ "Both Azure OMS Agent and BOSH Health Metrics Forwarder"
+ ],
+ "metadata": {
+ "description": "Select your provider of system metrics"
+ }
+ },
+ "cloudFoundryVersion": {
+ "type": "string",
+ "defaultValue": "2.0+",
+ "allowedValues": [
+ "2.0+",
+ "1.12 or earlier"
+ ],
+ "metadata": {
+ "description": "Cloud Foundry environment has version 2.0+"
+ }
+ },
+ "_omsViewsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/oms-log-analytics-firehose-nozzle/master/docs/omsview/",
+ "metadata": {
+ "description": "The base URI where OMS views required by this template are located"
+ }
+ },
+ "_omsViewsLocationParameters": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Parameters required to access _omsViewsLocation."
+ }
+ }
+ },
+ "variables": {
+ "omsviews": {
+ "defailt": [
+ "Cloud%20Foundry.omsview",
+ "CF%20KPI%20-%20Diego%20Metrics.omsview",
+ "CF%20KPI%20-%20Doppler%20Server%20Metrics.omsview",
+ "CF%20KPI%20-%20Gorouter%20Metrics.omsview",
+ "CF%20-%20Apps.omsview",
+ "CF%20-%20BBS.omsview",
+ "CF%20-%20Cell%20Capacity.omsview",
+ "CF%20-%20Cloud%20Controller.omsview",
+ "CF%20-%20Component%20Metrics.omsview",
+ "CF%20-%20Diego%20Auctions.omsview",
+ "CF%20-%20Diego%20Health.omsview",
+ "CF%20-%20Doppler%20Server.omsview",
+ "CF%20-%20Garden%20Linux.omsview",
+ "CF%20-%20Gorouter.omsview",
+ "CF%20-%20LRPs%20and%20Tasks.omsview",
+ "CF%20-%20Metron%20Agent.omsview",
+ "CF%20-%20Nozzle%20Status.omsview",
+ "CF%20-%20Route%20Emitter.omsview",
+ "CF%20-%20UAA.omsview"
+ ],
+ "legacy": [
+ "CF%20-%20Etcd.omsview",
+ "CF%20-%20Etcd%20Operations.omsview"
+ ],
+ "system_metrics": {
+ "oms_agent": "https://raw.githubusercontent.com/Azure/oms-agent-for-linux-boshrelease/master/docs/omsview/Syslog%20and%20Perf.omsview",
+ "hm_forwarder": "https://raw.githubusercontent.com/Azure/oms-log-analytics-firehose-nozzle/master/docs/omsview/CF%20KPI%20-%20System%20Metrics.omsview"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').defailt[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').defailt[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "[replace(replace(variables('omsviews').legacy[copyIndex()], '%20', '_'), '_-_', '-')]",
+ "condition": false,
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[concat(parameters('_omsViewsLocation'), '/', variables('omsviews').legacy[copyIndex()], parameters('_omsViewsLocationParameters'))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "CF_KPI-Syslog_and_Perf.omsview",
+ "condition": "[contains(parameters('systemMetricsProvider'), 'Azure OMS Agent')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(omsviews).system_metrics.oms_agent",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "CF_KPI-System_Metrics.omsview",
+ "condition": "[contains(parameters('systemMetricsProvider'), 'BOSH Health Metrics Forwarder')]",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(omsviews).system_metrics.hm_forwarder",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "resourcegroup": {
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "value": "East US"
+ },
+ "subscriptionId": {
+ "value": "[subscription().subscriptionId]"
+ },
+ "workspace": {
+ "value": "omsWorkspaceName"
+ },
+ "workspaceapiversion": {
+ "value": "2017-03-03-preview"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsWorkspaceName'), '[CloudFoundry]')]",
+ "location": "East US",
+ "dependsOn": [
+ "viewCopy"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Overview",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Diego%20Metrics",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Doppler%20Server%20Metrics",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Gorouter%20Metrics",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Apps",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20BBS",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Cell%20Capacity",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Cloud%20Controller",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Component%20Metrics",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Diego%20Auctions",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Diego%20Health",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Doppler%20Server",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Etcd%20Operations",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Etcd",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Garden%20Linux",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Gorouter",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20LRPs%20and%20Tasks",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Metron%20Agent",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Nozzle%20Status",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20Route%20Emitter",
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20-%20UAA"
+ ]
+ },
+ "plan": {
+ "name": "[concat('cloudfoundrysolution', '[' ,parameters('omsWorkspaceName'), ']')]",
+ "product": "cloudfoundrysolution",
+ "promotionCode": "",
+ "publisher": "Microsoft",
+ "version": "1.0"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsWorkspaceName'), '[OMSAgentBOSHRelease]')]",
+ "location": "East US",
+ "condition": "[contains(parameters('systemMetricsProvider'), 'Azure OMS Agent')]",
+ "dependsOn": [
+ "viewCopy"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/Syslog%20and%20Perf"
+ ]
+ },
+ "plan": {
+ "name": "[concat('omsagentsolution', '[' ,parameters('omsWorkspaceName'), ']')]",
+ "product": "OMS Agent BOSH Release Solution",
+ "promotionCode": "",
+ "publisher": "Microsoft",
+ "version": "1.0"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsWorkspaceName'), '[BOSHHealthMetricsForwarder]')]",
+ "location": "East US",
+ "condition": "[contains(parameters('systemMetricsProvider'), 'BOSH Health Metrics Forwarder')]",
+ "dependsOn": [
+ "viewCopy"
+ ],
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/omsWorkspaceName",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//omsWorkspaceName/CF%20KPI%20-%20System%20Metrics"
+ ]
+ },
+ "plan": {
+ "name": "[concat('boshhmforwarder', '[' ,parameters('omsWorkspaceName'), ']')]",
+ "product": "BOSH HM Forwarder Solution",
+ "promotionCode": "",
+ "publisher": "Microsoft",
+ "version": "1.0"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT765 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT765
new file mode 100644
index 0000000..d22b058
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT765
@@ -0,0 +1,883 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsSavedSearches.json"
+ ],
+ "timestamp": 1642962900901,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsSavedSearches.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT765",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces/savedsearches"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT765",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Input the name of your OMS Workspace"
+ }
+ }
+ },
+ "variables": {
+ "savedSearches": {
+ "templates": [
+ {
+ "name": "CF-Average CPU Usage by Application Instance",
+ "category": "CF-Apps",
+ "query": "CF_ContainerMetric_CL | summarize avg(CPUPercentage_d) by Environment_s, ApplicationName_s, InstanceIndex_d, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Average Memory Usage by Application Instance",
+ "category": "CF-Apps",
+ "query": "CF_ContainerMetric_CL | summarize avg(MemoryBytes_d) by Environment_s, ApplicationName_s, InstanceIndex_d, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Average Memory Quota Application Instance",
+ "category": "CF-Apps",
+ "query": "CF_ContainerMetric_CL | summarize avg(MemoryBytesQuota_d) by Environment_s, ApplicationName_s, InstanceIndex_d, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Average Disk Usage by Application Instance",
+ "category": "CF-Apps",
+ "query": "CF_ContainerMetric_CL | summarize avg(DiskBytes_d) by Environment_s, ApplicationName_s, InstanceIndex_d, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Average Disk Quota Application Instance",
+ "category": "CF-Apps",
+ "query": "CF_ContainerMetric_CL | summarize avg(DiskBytesQuota_d) by Environment_s, ApplicationName_s, InstanceIndex_d, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Total BBS Request Count",
+ "category": "CF-BBS",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"bbs\" and Name_s == \"RequestCount\" | summarize max(Total_d) by Environment_s, Job_s, IP_s"
+ },
+ {
+ "name": "CF-BBS Request Latency",
+ "category": "CF-BBS",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"RequestLatency\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Total Convergence LRP & Task Runs",
+ "category": "CF-BBS",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"bbs\" and (Name_s == \"ConvergenceLRPRuns\" or Name_s == \"ConvergenceTaskRuns\") | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Total Convergence Tasks Kicked & Pruned",
+ "category": "CF-BBS",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"bbs\" and (Name_s == \"ConvergenceTasksKicked\" or Name_s == \"ConvergenceTasksPruned\") | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Convergence LRP & Task Duration",
+ "category": "CF-BBS",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and (Name_s == \"ConvergenceLRPDuration\" or Name_s == \"ConvergenceTaskDuration\") | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Malformed LRPs",
+ "category": "CF-BBS",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and (Name_s == \"ConvergenceLRPDuration\" or Name_s == \"ConvergenceLRPPreProcessing\") | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Number of HTTP Responses",
+ "category": "CF-CC",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"cc\" and Name_s contains_cs \"http_status\" | summarize max(Value_d) by Environment_s, IP_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Job Queue Length",
+ "category": "CF-CC",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"cc\" and Name_s contains_cs \"job_queue_length\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Failed Job Count",
+ "category": "CF-CC",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"cc\" and Name_s contains_cs \"failed_job_count\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of Requests Completed",
+ "category": "CF-CC",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"cc\" and Name_s == \"requests.completed\" | summarize max(Value_d) by Environment_s, Job_s, IP_s"
+ },
+ {
+ "name": "CF-Number of Requests Being Processed",
+ "category": "CF-CC",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"cc\" and Name_s == \"requests.outstanding\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of Log Messages",
+ "category": "CF-CC",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"cc\" and Name_s contains_cs \"log_count\" | summarize avg(Value_d) by Environment_s, IP_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Total & Remaining Containers",
+ "category": "CF-Cells Capacity",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s contains_cs \"Containers\" | summarize avg(Value_d) by Environment_s, IP_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Total & Remaining Memory",
+ "category": "CF-Cells Capacity",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s contains_cs \"Memory\" | summarize avg(Value_d) by Environment_s, IP_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Total & Remaining Disk",
+ "category": "CF-Cells Capacity",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s contains_cs \"Disk\" | summarize avg(Value_d) by Environment_s, IP_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of CPUs",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"numCPUS\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of Go Routines",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"numGoRoutines\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Memory Usage",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"memoryStats.numBytesAllocated\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Stack Allocator Memory Usage",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"memoryStats.numBytesAllocatedStack\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Main Heap Memory Usage",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"memoryStats.numBytesAllocatedHeap\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Garbage Collector Pause Duration",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"memoryStats.lastGCPauseTimeNS\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of Memory Allocations",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"memoryStats.numMallocs\" | summarize max(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of Memory Deallocations",
+ "category": "CF-Component Metrics",
+ "query": "CF_ValueMetric_CL | where Name_s == \"memoryStats.numFrees\" | summarize max(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Total Auctions",
+ "category": "CF-Diego Auctions",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s contains_cs \"Auctions\" | summarize max(Total_d) by Environment_s, Name_s"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Auctions per Minute",
+ "category": "CF-Diego Auctions",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"auctioneer\" and Name_s contains_cs \"Auctions\" | summarize sum(Delta_d) by Environment_s, Name_s, bin(TimeGenerated, 1m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Fetch States Duration",
+ "category": "CF-Diego Auctions",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"auctioneer\" and Name_s == \"AuctioneerFetchStatesDuration\" | summarize max(Value_d) by Environment_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-CF Apps Synchronized",
+ "category": "CF-Diego Health",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"Domain.cf-apps\" | summarize min(Value_d) by Environment_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-CF Tasks Synchronized",
+ "category": "CF-Diego Health",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s == \"Domain.cf-tasks\" | summarize min(Value_d) by Environment_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Unhealthy Cells",
+ "category": "CF-Diego Health",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"rep\" and Name_s == \"UnhealthyCell\" | summarize max(Value_d) by Environment_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of Sinks",
+ "category": "CF-Doppler Server",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"DopplerServer\" and Name_s contains_cs \"messageRouter.numberOf\" | summarize max(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Number of Messages Unmarshalled",
+ "category": "CF-Doppler Server",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"DopplerServer\" and Name_s contains_cs \"dropsondeUnmarshaller\" and Name_s != \"dropsondeUnmarshaller.unmarshalErrors\" | summarize max(Total_d) by Environment_s, Name_s"
+ },
+ {
+ "name": "CF-Number of Messages Received by Listeners",
+ "category": "CF-Doppler Server",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"DopplerServer\" and Name_s == \"listeners.totalReceivedMessageCount\" | summarize max(Total_d) by Environment_s"
+ },
+ {
+ "name": "CF-Unmarshal Errors",
+ "category": "CF-Doppler Server",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"DopplerServer\" and Name_s == \"dropsondeUnmarshaller.unmarshalErrors\" | summarize max(Total_d) by Environment_s"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Dropped Messages",
+ "category": "CF-Doppler Server",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"DopplerServer\" and (Name_s == \"TruncatingBuffer.totalDroppedMessages\" or Name_s == \"doppler.shedEnvelopes\") | summarize max(Total_d) by Environment_s, Name_s"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Leader",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s == \"IsLeader\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Followers",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s == \"Followers\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Watchers",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s == \"Watchers\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Raft Term",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s == \"RaftTerm\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Raft Index",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s == \"RaftIndex\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Sending & Receiving Bandwidth Rate",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"BandwidthRate\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Sending & Receiving Request Rate",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"RequestRate\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Latency",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s == \"Latency\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Sent & Received Append Requests Rate",
+ "category": "CF-Etcd",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"AppendRequests\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Sets Success & Fail",
+ "category": "CF-Etcd Operations",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"Sets\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Gets Success & Fail",
+ "category": "CF-Etcd Operations",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"Gets\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Create Success & Fail",
+ "category": "CF-Etcd Operations",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"Create\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Update Success & Fail",
+ "category": "CF-Etcd Operations",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"Update\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Delete Success & Fail",
+ "category": "CF-Etcd Operations",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and (Name_s == \"DeleteSuccess\" or Name_s == \"DeleteFail\") | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-CompareAndDelete Success & Fail",
+ "category": "CF-Etcd Operations",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"CompareAndDelete\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-CompareAndSwap Success & Fail",
+ "category": "CF-Etcd Operations",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"etcd\" and Name_s contains_cs \"CompareAndSwap\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Number of Container Backing Store Files",
+ "category": "CF-Garden Linux",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"garden-linux\" and Name_s == \"BackingStores\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "_shownOnPcf2": "false",
+ "name": "CF-Number of Directories in the Garden Depot",
+ "category": "CF-Garden Linux",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"garden-linux\" and Name_s == \"LoopDevices\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Number of Attached Loop Devices",
+ "category": "CF-Garden Linux",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"garden-linux\" and Name_s == \"DepotDirs\" | summarize avg(Value_d) by Environment_s, Job_s, IP_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-LRPs",
+ "category": "CF-LRPs & Tasks",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s contains_cs \"LRPs\" and Name_s !contains_cs \"Crash\" | summarize avg(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Tasks",
+ "category": "CF-LRPs & Tasks",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s contains_cs \"Tasks\" and Name_s !contains_cs \"Convergence\" | summarize avg(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Crashing LRPs",
+ "category": "CF-LRPs & Tasks",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"bbs\" and Name_s contains_cs \"Crash\" | summarize avg(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Desired LRP Sync Duration",
+ "category": "CF-LRPs & Tasks",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"nsync_bulker\" and Name_s == \"DesiredLRPSyncDuration\" | summarize avg(Value_d) by Environment_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Sent & Received Dropsonde Envelopes",
+ "category": "CF-Metron Agent",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"MetronAgent\" and Name_s contains_cs \"Envelopes\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Messages Unmarshalled",
+ "category": "CF-Metron Agent",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"MetronAgent\" and ((Name_s contains_cs \"dropsondeUnmarshaller\" and Name_s contains_cs \"Received\") or Name_s == \"dropsondeUnmarshaller.logMessageTotal\") | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Dropsonde Messages Received by Agent Listener",
+ "category": "CF-Metron Agent",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"MetronAgent\" and Name_s == \"dropsondeAgentListener.receivedMessageCount\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Dropsonde Bytes Received by Agent Listener",
+ "category": "CF-Metron Agent",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"MetronAgent\" and Name_s == \"dropsondeAgentListener.receivedByteCount\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Messages Sent to Doppler",
+ "category": "CF-Metron Agent",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"MetronAgent\" and Name_s contains_cs \"sentMessageCount\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Bytes Sent to Doppler",
+ "category": "CF-Metron Agent",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"MetronAgent\" and Name_s contains_cs \"sentByteCount\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Errors Sent to Doppler",
+ "category": "CF-Metron Agent",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"MetronAgent\" and Name_s contains_cs \"sendErrorCount\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Number of Routes",
+ "category": "CF-Route Emitter",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"route_emitter\" and Name_s == \"RoutesTotal\" | summarize avg(Value_d) by Environment_s, Job_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Total Routes Registered, Synced and Unregistered",
+ "category": "CF-Route Emitter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"route_emitter\" and (Name_s == \"RoutesRegistered\" or Name_s == \"RoutesSynced\" or Name_s == \"RoutesUnregistered\") | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Total Registration Messages Emitted",
+ "category": "CF-Route Emitter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"route_emitter\" and Name_s == \"MessagesEmitted\" | summarize max(Total_d) by Environment_s, Job_s"
+ },
+ {
+ "name": "CF-Route Emitter Time to Sync",
+ "category": "CF-Route Emitter",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"route_emitter\" and Name_s == \"RouteEmitterSyncDuration\" | summarize avg(Value_d) by Environment_s, Job_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Requests per Minute",
+ "category": "CF-Gorouter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and (Name_s == \"rejected_requests\" or Name_s == \"total_requests\") | summarize sum(Delta_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 1m)"
+ },
+ {
+ "name": "CF-Responses per Minute",
+ "category": "CF-Gorouter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s contains_cs \"responses\" | summarize sum(Delta_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 1m)"
+ },
+ {
+ "name": "CF-Total Requests",
+ "category": "CF-Gorouter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and (Name_s == \"rejected_requests\" or Name_s == \"total_requests\") | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Total Responses",
+ "category": "CF-Gorouter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s contains_cs \"responses\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Latency",
+ "category": "CF-Gorouter",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s contains_cs \"latency\" | summarize avg(Value_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Route Lookup Time",
+ "category": "CF-Gorouter",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"route_lookup_time\" | summarize avg(Value_d) by Environment_s, Job_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Register Messages Received per Minute",
+ "category": "CF-Gorouter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s contains_cs \"registry_message\" | summarize sum(Delta_d) by Environment_s, Job_s, Name_s, bin(TimeGenerated, 1m)"
+ },
+ {
+ "name": "CF-Total Register Messages Received",
+ "category": "CF-Gorouter",
+ "query": "CF_CounterEvent_CL | where Origin_s == \"gorouter\" and Name_s contains_cs \"registry_message\" | summarize max(Total_d) by Environment_s, Job_s, Name_s"
+ },
+ {
+ "name": "CF-Total Routes Registered",
+ "category": "CF-Gorouter",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"gorouter\" and Name_s == \"total_routes\" | summarize avg(Value_d) by Environment_s, Job_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-User & Non-user Not Found",
+ "category": "CF-UAA",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"uaa\" and Name_s contains_cs \"not_found_count\" | summarize max(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Failed Non-user Authentication Attempts",
+ "category": "CF-UAA",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"uaa\" and Name_s == \"audit_service.principal_authentication_failure_count\" | summarize max(Value_d) by Environment_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Successful & Failed User Authentications",
+ "category": "CF-UAA",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"uaa\" and Name_s contains_cs \"user_authentication\" | summarize max(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Successful & Failed Client Authentications",
+ "category": "CF-UAA",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"uaa\" and Name_s contains_cs \"client_authentication\" | summarize max(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Successful & Failed Password Changes",
+ "category": "CF-UAA",
+ "query": "CF_ValueMetric_CL | where Origin_s == \"uaa\" and Name_s contains_cs \"user_password\" | summarize max(Value_d) by Environment_s, Name_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Receiving Rate by Nozzle Instance Every 5 Minutes",
+ "category": "CF-Nozzle Status",
+ "query": "CF_CounterEvent_CL | where Job_s == \"nozzle\" and Name_s == \"eventsReceived\" | summarize sum(Delta_d) by NozzleInstance_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Sending Rate by Nozzle Instance Every 5 Minutes",
+ "category": "CF-Nozzle Status",
+ "query": "CF_CounterEvent_CL | where Job_s == \"nozzle\" and Name_s == \"eventsSent\" | summarize sum(Delta_d) by NozzleInstance_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Lost Messages by Nozzle Instance",
+ "category": "CF-Nozzle Status",
+ "query": "CF_CounterEvent_CL | where Job_s == \"nozzle\" and Name_s == \"eventsLost\" | summarize max(Total_d) by NozzleInstance_s, bin(TimeGenerated, 5m)"
+ },
+ {
+ "name": "CF-Total Recieved, Sent & Lost Messages by Nozzle Instance",
+ "category": "CF-Nozzle Status",
+ "query": "CF_CounterEvent_CL | where Job_s == \"nozzle\" | summarize max(Total_d) by NozzleInstance_s, Name_s"
+ },
+ {
+ "name": "CF-Slow Consumer Alert",
+ "category": "CF-Nozzle Status",
+ "query": "CF_ValueMetric_CL | where Name_s == \"slowConsumerAlert\" | summarize max(Value_d) by NozzleInstance_s, bin(TimeGenerated, 5m)"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsWorkspaceName'), '/', 'CF-SavedSearches-', uniquestring('SavedSearch'), '-', copyIndex())]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "apiVersion": "2017-03-15-preview",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "etag": "*",
+ "query": "(savedSearches).templates[copyIndex()].query",
+ "displayName": "(savedSearches).templates[copyIndex()].name",
+ "category": "(savedSearches).templates[copyIndex()].category"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT766 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT766
new file mode 100644
index 0000000..591f267
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT766
@@ -0,0 +1,99 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsWorkspace.json"
+ ],
+ "timestamp": 1642962900911,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/nested/omsWorkspace.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT766",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT766",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Assign a name for the Log Analytic Workspace Name"
+ }
+ },
+ "omsWorkspaceRegion": {
+ "type": "string",
+ "defaultValue": "West Europe",
+ "allowedValues": [
+ "Australia Southeast",
+ "East US",
+ "Japan East",
+ "Southeast Asia",
+ "UK South",
+ "West Central US",
+ "West Europe",
+ "North Europe"
+ ],
+ "metadata": {
+ "description": "Specify the region for your Workspace"
+ }
+ },
+ "azureMonitorPricingModel": {
+ "type": "string",
+ "defaultValue": "Pre April 2018",
+ "allowedValues": [
+ "Pre April 2018",
+ "April 2018"
+ ],
+ "metadata": {
+ "description": "Select Azure Monitor pricing model your subscription has enabled, NOTE that April 2018 pricing model would be enabled automatically if you onboard Azure Monitor later than April 2, 2018"
+ }
+ },
+ "omsWorkspaceSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "pernode",
+ "standalone"
+ ],
+ "metadata": {
+ "description": "Select the SKU for your workspace"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-03-preview",
+ "location": "West Europe",
+ "name": "omsWorkspaceName",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "comments": "Log Analytics workspace",
+ "tags": {
+ "Source": "QuickstartTemplates"
+ },
+ "properties": {
+ "sku": {
+ "name": "[if(equals(parameters('azureMonitorPricingModel'),'Pre April 2018'), parameters('omsWorkspaceSku'), 'pergb2018')]"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT767 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT767
new file mode 100644
index 0000000..2031814
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT767
@@ -0,0 +1,247 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/azuredeploy.json",
+ "/demos/oms-cloudfoundry-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900918,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-cloudfoundry-solution/azuredeploy.json",
+ "/demos/oms-cloudfoundry-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT767",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT767",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "[concat('log-analytics-workspace-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Input the name of your Log Analytic Workspace, a new workspace will be created if workspace with given name and location doesn't exist."
+ }
+ },
+ "omsWorkspaceRegion": {
+ "type": "string",
+ "defaultValue": "East US",
+ "allowedValues": [
+ "Australia Southeast",
+ "East US",
+ "Japan East",
+ "Southeast Asia",
+ "UK South",
+ "West Central US",
+ "West Europe",
+ "North Europe"
+ ],
+ "metadata": {
+ "description": "Specify the region for your Workspace"
+ },
+ "value": "West Europe"
+ },
+ "azureMonitorPricingModel": {
+ "type": "string",
+ "defaultValue": "Pre April 2018",
+ "allowedValues": [
+ "Pre April 2018",
+ "April 2018"
+ ],
+ "metadata": {
+ "description": "Select Azure Monitor pricing model your subscription has enabled, NOTE that April 2018 pricing model would be enabled automatically if you onboard Azure Monitor later than April 2, 2018"
+ },
+ "value": "Pre April 2018"
+ },
+ "omsWorkspaceSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "pernode",
+ "standalone"
+ ],
+ "metadata": {
+ "description": "Select the SKU for your workspace [This setting will be ignored if you enabled new pricing model April 2018]"
+ },
+ "value": "pernode"
+ },
+ "cloudFoundryVersion": {
+ "type": "string",
+ "defaultValue": "2.0+",
+ "allowedValues": [
+ "2.0+",
+ "1.12 or earlier"
+ ],
+ "metadata": {
+ "description": "Cloud Foundry environment has version 2.0+"
+ }
+ },
+ "systemMetricsProvider": {
+ "type": "string",
+ "defaultValue": "BOSH Health Metrics Forwarder Only",
+ "allowedValues": [
+ "None",
+ "Microsoft Azure OMS Agent Only",
+ "BOSH Health Metrics Forwarder Only",
+ "Both Azure OMS Agent and BOSH Health Metrics Forwarder"
+ ],
+ "metadata": {
+ "description": "Select your provider of system metrics"
+ },
+ "value": "None"
+ },
+ "actionGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the action group for alert actions"
+ },
+ "value": "None"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/oms-cloudfoundry-solution",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "variables": {
+ "nestedTemplates": {
+ "omsWorkspace": "[uri(concat(parameters('_artifactsLocation'), '/'), concat('nested/omsWorkspace.json', parameters('_artifactsLocationSasToken')))]",
+ "omsSavedSearches": "[uri(concat(parameters('_artifactsLocation'), '/'), concat('nested/omsSavedSearches.json', parameters('_artifactsLocationSasToken')))]",
+ "omsCustomViews": "[uri(concat(parameters('_artifactsLocation'), '/'), concat('nested/omsCustomViews.json', parameters('_artifactsLocationSasToken')))]",
+ "omsAlerts": "[uri(concat(parameters('_artifactsLocation'), '/'), concat('nested/omsAlerts.json', parameters('_artifactsLocationSasToken')))]"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "omsWorkspace",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsWorkspace",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "[concat('log-analytics-workspace-', uniqueString(resourceGroup().id))]"
+ },
+ "omsWorkspaceRegion": {
+ "value": "West Europe"
+ },
+ "omsWorkspaceSku": {
+ "value": "pernode"
+ },
+ "azureMonitorPricingModel": {
+ "value": "Pre April 2018"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "omsSavedSearches",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/omsWorkspace"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsSavedSearches",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "[concat('log-analytics-workspace-', uniqueString(resourceGroup().id))]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "omsCustomViews",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/omsWorkspace"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsCustomViews",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "[concat('log-analytics-workspace-', uniqueString(resourceGroup().id))]"
+ },
+ "omsWorkspaceRegion": {
+ "value": "West Europe"
+ },
+ "systemMetricsProvider": {
+ "value": "None"
+ },
+ "cloudFoundryVersion": {
+ "value": "2.0+"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2016-02-01",
+ "name": "omsAlerts",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/omsWorkspace"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(nestedTemplates).omsAlerts",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "omsWorkspaceName": {
+ "value": "[concat('log-analytics-workspace-', uniqueString(resourceGroup().id))]"
+ },
+ "actionGroupName": {
+ "value": "None"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "omsPortal": {
+ "type": "string",
+ "value": "[concat('https://', parameters('omsWorkspaceName'), '.portal.mms.microsoft.com')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT768 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT768
new file mode 100644
index 0000000..9310ed6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT768
@@ -0,0 +1,74 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-existing-storage-account/prereqs/prereq.azuredeploy.json",
+ "/demos/oms-existing-storage-account/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900926,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-existing-storage-account/prereqs/prereq.azuredeploy.json",
+ "/demos/oms-existing-storage-account/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT768",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT768",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Select OMS region"
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat(uniqueString(resourceGroup().id),'storage')]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "comments": "Storage account ",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ }
+ ],
+ "outputs": {
+ "storageaccountName": {
+ "type": "string",
+ "value": "[variables('storageAccountName')]"
+ },
+ "storageaccountresourcegroupName": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT769 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT769
new file mode 100644
index 0000000..32aa469
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT769
@@ -0,0 +1,138 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-existing-storage-account/azuredeploy.json",
+ "/demos/oms-existing-storage-account/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900934,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-existing-storage-account/azuredeploy.json",
+ "/demos/oms-existing-storage-account/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT769",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT769",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify name of your OMS workspace"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Select OMS region"
+ }
+ },
+ "existingStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of the existing storage account to add to OMS"
+ },
+ "value": "GET-PREREQ-storageaccountName"
+ },
+ "existingStorageAccountResourceGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource group containing the storage account"
+ },
+ "value": "GET-PREREQ-storageaccountresourcegroupName"
+ },
+ "table": {
+ "type": "string",
+ "defaultValue": "WADServiceFabric*EventTable",
+ "allowedValues": [
+ "WADWindowsEventLogsTable",
+ "WADServiceFabric*EventTable",
+ "wad-iis-logfiles",
+ "WADETWEventTable"
+ ],
+ "metadata": {
+ "description": "Select the table to add to OMS"
+ },
+ "value": "WADServiceFabric*EventTable"
+ },
+ "omsworkspaceName": {
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "variables": {
+ "solution": "ServiceFabric(, parameters(omsWorkspaceName), )",
+ "solutionName": "ServiceFabric"
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "name": "ServiceFabric(, parameters(omsWorkspaceName), )",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "id": "Microsoft.OperationsManagement/solutions//ServiceFabric(, parameters(omsWorkspaceName), )",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsWorkspaceName"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//omsWorkspaceName"
+ },
+ "plan": {
+ "name": "ServiceFabric(, parameters(omsWorkspaceName), )",
+ "publisher": "Microsoft",
+ "product": "[Concat('OMSGallery/', variables('solutionName'))]",
+ "promotionCode": ""
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "omsWorkspaceName",
+ "location": "[resourceGroup().location]",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "properties": {
+ "sku": {
+ "name": "Free"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "existingstorageaccountNameomsWorkspaceName",
+ "type": "storageinsightconfigs",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//omsWorkspaceName"
+ ],
+ "properties": {
+ "tables": [
+ "WADServiceFabric*EventTable"
+ ],
+ "storageAccount": {
+ "id": "GET-PREREQ-storageaccountresourcegroupName/Microsoft.Storage/storageaccounts//GET-PREREQ-storageaccountName",
+ "key": "[listKeys(resourceId(parameters('existingStorageAccountResourceGroupName'),'Microsoft.Storage/storageAccounts', parameters('existingStorageAccountName')),'2021-04-01').keys[0].value]"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT77 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT77
new file mode 100644
index 0000000..03e546c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT77
@@ -0,0 +1,640 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeployGermany.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885496,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeployGermany.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT77",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT77",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Admin user name for the VMs"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password for the VMs (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "cmUsername": {
+ "type": "string",
+ "defaultValue": "cmadmin",
+ "metadata": {
+ "description": "User name for the Cloudera Manager"
+ }
+ },
+ "cmPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "password for the Cloudera Manager (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS name where the VMs will be exposed"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "masterStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for master nodes (defaults to Premium_LRS)"
+ },
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for worker nodes (defaults to Standard_LRS)"
+ },
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "clouderavnet",
+ "metadata": {
+ "description": "The name of the virtual network provisioned for the deployment"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "vnetNewOrExisting": {
+ "type": "string",
+ "defaultValue": "new",
+ "allowedValues": [
+ "new",
+ "existing"
+ ],
+ "metadata": {
+ "description": "Indicator for new or exiting Virtual Network"
+ }
+ },
+ "virtualNetworkRGName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Resource Group Name for Vnet. For new VNet leave it empty, otherwise type in existing resource group name"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "clouderasubnet",
+ "metadata": {
+ "description": "Subnet name for the virtual network where resources will be provisioned"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "Virtual Network address CIDR"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "CIDR for the subnet where VMs will be placed"
+ }
+ },
+ "masterNodeIPAddress": {
+ "type": "string",
+ "defaultValue": "10.3.0.4",
+ "metadata": {
+ "description": "IP address for the first master"
+ }
+ },
+ "dataNodeIPOffSetFromMaster": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "IP address from the master node, for example if the first master is 10.1.1.1, then the first dataNode would be 10.1.1.11"
+ }
+ },
+ "tshirtSize": {
+ "type": "string",
+ "defaultValue": "Eval",
+ "allowedValues": [
+ "Eval",
+ "Prod"
+ ],
+ "metadata": {
+ "description": "T-shirt size of the Cloudera cluster (Eval, Prod)"
+ },
+ "value": "Eval"
+ },
+ "numberOfDataNodes": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Number of data nodes for Prod (defaults to 3)"
+ },
+ "value": 3
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D16s_v3",
+ "metadata": {
+ "description": "The size of the VMs deployed in the cluster (defaults to Standard_DS14_V2)"
+ },
+ "allowedValues": [
+ "Standard_D16s_v3",
+ "Standard_D8s_v3"
+ ],
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "type": "string",
+ "defaultValue": "ClouderaCentOS6_7Germany",
+ "metadata": {
+ "description": "The OS VM Image (defaults to ClouderaCentOS6_7Germany)"
+ },
+ "allowedValues": [
+ "ClouderaCentOS6_7Germany"
+ ],
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "type": "string",
+ "defaultValue": "Company",
+ "metadata": {
+ "description": "Your Company"
+ },
+ "value": "company"
+ },
+ "emailAddress": {
+ "type": "string",
+ "defaultValue": "email@yourcompany.com",
+ "metadata": {
+ "description": "your email"
+ },
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "type": "string",
+ "defaultValue": "123456789",
+ "metadata": {
+ "description": "your business phone number"
+ },
+ "value": "123456789"
+ },
+ "firstName": {
+ "type": "string",
+ "defaultValue": "FirstName",
+ "metadata": {
+ "description": "Your FirstName"
+ },
+ "value": "FirstName"
+ },
+ "lastName": {
+ "type": "string",
+ "defaultValue": "LastName",
+ "metadata": {
+ "description": "Your LastName"
+ },
+ "value": "LastName"
+ },
+ "jobRole": {
+ "type": "string",
+ "defaultValue": "Administrator",
+ "metadata": {
+ "description": "Job Role"
+ },
+ "allowedValues": [
+ "Administrator",
+ "Analyst (Industry/Finance)",
+ "Analyst (Technical)",
+ "Architect",
+ "C level",
+ "Consultant",
+ "Developer",
+ "Director",
+ "Engineer",
+ "Individual contributor",
+ "Manager",
+ "Partner",
+ "Student",
+ "VP"
+ ],
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "type": "string",
+ "defaultValue": "Analytics / Business Intelligence",
+ "metadata": {
+ "description": "Job Function"
+ },
+ "allowedValues": [
+ "Analytics / Business Intelligence",
+ "Big Data / Architecture",
+ "Data Warehouse / Management",
+ "Data Science",
+ "Database",
+ "ETL / ELT",
+ "Infrastructure",
+ "IT",
+ "Marketing / Sales",
+ "Networking",
+ "Manager",
+ "Security / Compliance",
+ "Storage"
+ ],
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "templateAPIVersion": "2015-11-01",
+ "resourceAPIVersion": "2015-06-15",
+ "installCDH": "True",
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "scriptsUriDescription": "For Command Line Deployment, scriptsUri must point to an Azure-accessible location like: https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos",
+ "scriptsUri": "[uri(deployment().properties.templateLink.uri, '.')]",
+ "share-resourcesUri": "[uri(deployment().properties.templateLink.uri, '.')]/shared-resources-new-vnet.json",
+ "data-nodeUri": "[concat(variables('scriptsUri'), '/data-node-', toLower(subString(parameters('vmSize'), 0, 13)), '.json')]",
+ "sa": "10.3.0.4",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterStorageAccount": {
+ "type": "Premium_LRS"
+ },
+ "workerStorageAccount": {
+ "type": "Standard_LRS"
+ },
+ "clusterTshirtSizeEval": {
+ "masterNodeCount": 1,
+ "dataNodeCount": 3,
+ "highAvailability": "false"
+ },
+ "clusterTshirtSizeProd": {
+ "masterNodeCount": 3,
+ "dataNodeCount": 3,
+ "highAvailability": "true"
+ },
+ "clusterSpec": "concat(clusterTshirtSize, parameters(tshirtSize))",
+ "vmImageInfo": {
+ "ClouderaCentOS6_7": {
+ "plan": {
+ "name": "cloudera-centos-6",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-6"
+ },
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-6",
+ "sku": "cloudera-centos-6",
+ "version": "latest"
+ }
+ },
+ "ClouderaCentOS6_8": {
+ "plan": {
+ "name": "6_8",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-os"
+ },
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-os",
+ "sku": "6_8",
+ "version": "latest"
+ }
+ },
+ "ClouderaCentOS6_7Germany": {
+ "plan": null,
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-os",
+ "sku": "6_7",
+ "version": "latest"
+ }
+ }
+ },
+ "vmSpec": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ },
+ "networkSpec": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ },
+ "newVNetId": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "existingVNetId": "parameters('virtualNetworkRGName')/Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "VNetId": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resources": [
+ {
+ "name": "shared-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/shared-resources-new-vnet.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "masterNodeASName": {
+ "value": "(vmSpec).masterNodeASName"
+ },
+ "dataNodeASName": {
+ "value": "(vmSpec).dataNodeASName"
+ }
+ }
+ }
+ },
+ {
+ "name": "master-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/master-node.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "storageAccount": {
+ "value": {
+ "type": "Premium_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).masterNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "data-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('data-nodeUri')]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "templateAPIVersion": {
+ "value": "2015-11-01"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "storageAccount": {
+ "value": {
+ "type": "Standard_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).dataNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "setup-cloudera",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/data-node",
+ "Microsoft.Resources/deployments/master-node"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(deployment().properties.templateLink.uri, '.')]/setup-cloudera.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "[uri(deployment().properties.templateLink.uri, '.')]"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "imageInfo": "(vmImageInfo)[parameters(vmImage)]",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "fqdn": {
+ "value": "[reference('master-node').outputs.fqdn.value]"
+ },
+ "cmUsername": {
+ "value": "cmadmin"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "company": {
+ "value": "Company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ },
+ "installCDH": {
+ "value": "True"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT770 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT770
new file mode 100644
index 0000000..7e74cf2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT770
@@ -0,0 +1,71 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-extension-ubuntu-vm/prereqs/prereq.azuredeploy.json",
+ "/demos/oms-extension-ubuntu-vm/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900942,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-extension-ubuntu-vm/prereqs/prereq.azuredeploy.json",
+ "/demos/oms-extension-ubuntu-vm/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT770",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT770",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspacename": {
+ "type": "string",
+ "metadata": {
+ "description": "OMS Workspace name"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "retentionInDays": 30,
+ "publicNetworkAccessForIngestion": "Enabled",
+ "publicNetworkAccessForQuery": "Enabled"
+ }
+ }
+ ],
+ "outputs": {
+ "workSpaceName": {
+ "type": "string",
+ "value": "[parameters('omsWorkspacename')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT771 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT771
new file mode 100644
index 0000000..6a309db
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT771
@@ -0,0 +1,304 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-extension-ubuntu-vm/azuredeploy.json",
+ "/demos/oms-extension-ubuntu-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900954,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-extension-ubuntu-vm/azuredeploy.json",
+ "/demos/oms-extension-ubuntu-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT771",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT771",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "workspace id."
+ },
+ "value": "GET-PREREQ-workSpaceName"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Label for the Public IP. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version."
+ },
+ "value": "18.04-LTS"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The size of the VM."
+ },
+ "value": "Standard_D2s_v3"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "nsgName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the NSG."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "nsgName": "GEN-UNIQUE",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyUbuntuVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-13"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-11-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "AllowInternet",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "Internet",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/myPublicIP",
+ "Microsoft.Network/virtualNetworks/MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyUbuntuVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "MyUbuntuVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "MyUbuntuVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[concat('http://', variables('storageAccountName'), '.blob.', environment().suffixes.storage)]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "MyUbuntuVM/OMSExtension",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/MyUbuntuVM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.EnterpriseCloud.Monitoring",
+ "type": "OmsAgentForLinux",
+ "typeHandlerVersion": "1.10",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "workspaceId": "[reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName')), '2020-08-01').customerId]"
+ },
+ "protectedSettings": {
+ "workspaceKey": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName')), '2020-08-01').primarySharedKey]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT772 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT772
new file mode 100644
index 0000000..2c78444
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT772
@@ -0,0 +1,71 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-extension-windows-vm/prereqs/prereq.azuredeploy.json",
+ "/demos/oms-extension-windows-vm/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900965,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-extension-windows-vm/prereqs/prereq.azuredeploy.json",
+ "/demos/oms-extension-windows-vm/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT772",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT772",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspacename": {
+ "type": "string",
+ "metadata": {
+ "description": "OMS Workspace name"
+ },
+ "value": "GEN-UNIQUE-16"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-16",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "retentionInDays": 30,
+ "publicNetworkAccessForIngestion": "Disabled",
+ "publicNetworkAccessForQuery": "Disabled"
+ }
+ }
+ ],
+ "outputs": {
+ "workSpaceName": {
+ "type": "string",
+ "value": "[parameters('omsWorkspacename')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT773 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT773
new file mode 100644
index 0000000..bca4932
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT773
@@ -0,0 +1,252 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-extension-windows-vm/azuredeploy.json",
+ "/demos/oms-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900975,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-extension-windows-vm/azuredeploy.json",
+ "/demos/oms-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT773",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT773",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The size of the VM."
+ },
+ "value": "Standard_D2s_v3"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Label for the Public IP. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Log Analytics workspace name"
+ },
+ "value": "GET-PREREQ-workSpaceName"
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "Windows-Server-Technical-Preview"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter, Windows-Server-Technical-Preview."
+ },
+ "value": "2012-R2-Datacenter"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]",
+ "apiVersion": "2015-06-15",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_GRS",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_GRS"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-13"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/myPublicIP",
+ "Microsoft.Network/virtualNetworks/MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "MyVM",
+ "adminUsername": "GEN-UNIQUE-8",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "MyVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[concat('http://', variables('storageAccountName'), '.blob.', environment().suffixes.storage)]"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "extensions",
+ "name": "Microsoft.EnterpriseCloud.Monitoring",
+ "apiVersion": "2015-06-15",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/MyVM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.EnterpriseCloud.Monitoring",
+ "type": "MicrosoftMonitoringAgent",
+ "typeHandlerVersion": "1.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "workspaceId": "[reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName')), '2020-08-01').customerId]"
+ },
+ "protectedSettings": {
+ "workspaceKey": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName')), '2020-08-01').primarySharedKey]"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT774 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT774
new file mode 100644
index 0000000..588927c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT774
@@ -0,0 +1,642 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-hyperv-replica-solution/azuredeploy.json",
+ "/demos/oms-hyperv-replica-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962900983,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-hyperv-replica-solution/azuredeploy.json",
+ "/demos/oms-hyperv-replica-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT774",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT774",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.1.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of your OMS Log Analytics workspace."
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "workspaceRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "The region of your OMS Log Analytics workspace."
+ },
+ "value": "eastus"
+ },
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Automation account to use. If this account exists, check the pricing tier and tags to make sure they match the exisitng account."
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "automationRegion": {
+ "type": "string",
+ "metadata": {
+ "description": "The region the Automaiton account is located in."
+ },
+ "value": "eastus"
+ },
+ "automationPricingTier": {
+ "type": "string",
+ "allowedValues": [
+ "Free",
+ "Basic"
+ ],
+ "metadata": {
+ "description": "The pricing tier for the Automation account."
+ },
+ "defaultValue": "Free"
+ },
+ "onPremisesRunAsUserName": {
+ "type": "string",
+ "metadata": {
+ "description": "The username for the Account That Has Access To The On-Premises servers."
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "onPremisesRunAsPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the Account That Has Access To The On-Premises servers."
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "workSpaceID": {
+ "type": "string",
+ "metadata": {
+ "description": "The Work Space ID for your OMS workspace."
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "workSpacePrimaryKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The Work Space Primary Key for your OMS workspace."
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "automation": {
+ "Asset": {
+ "omsHypervReplicaRunNumber": {
+ "name": "omsHypervReplicaRunNumber",
+ "type": "int",
+ "value": "1",
+ "description": "This variable keeps track of the Hyper-V run number."
+ },
+ "omsHypervReplicaRunAsAccount": {
+ "name": "omsHypervReplicaRunAsAccount",
+ "description": "This runbook publishes Hyper-V replica statistics to OMS."
+ }
+ },
+ "runbook": {
+ "publishOmsHyperVReplica": {
+ "name": "Publish-omsHyperVReplica",
+ "type": "Script",
+ "description": "This runbook publishes Hyper-V replica statistics to OMS."
+ }
+ },
+ "module": {
+ "OMSDataInjection": {
+ "name": "OMSDataInjection",
+ "description": "This runbook publishes Hyper-V replica statistics to OMS."
+ }
+ },
+ "connection": {
+ "OMSDataInjection": {
+ "name": "omsHypervReplicaOMSConnection",
+ "description": "This connection stores the details for the Hybrid Runbook workers to inject the data into OMS.",
+ "type": "OMSWorkSpace"
+ }
+ }
+ },
+ "solution": {
+ "Name": "[concat('hypervReplica', ' [' ,parameters('workspaceName'), ']')]",
+ "DisplayName": "Hyper-V Replica Monitoring",
+ "Version": "1.0.0.0",
+ "Publisher": "bentaylor.work",
+ "Product": "bentaylorworkHypervReplica",
+ "PromotionCode": "",
+ "Description": "Hyper-V Replication Monitoring Through OMS",
+ "Author": "ben@bentaylor.work"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-20",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "eastus",
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(solution).Name",
+ "type": "views",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "Name": "(solution).Name",
+ "Author": "(solution).Author",
+ "DisplayName": "(solution).DisplayName",
+ "Description": "(solution).Description",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Current Hyper-V Replica Results By Status",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Number At Each Status"
+ },
+ "Donut": {
+ "Query": "Type=hyperVReplica_CL runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | measure count() by state_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Type=hyperVReplica_CL runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | measure count() by state_s",
+ "HideGraph": true,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Replica Status",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "5",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "10",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Current Failed Hyper-V Replicas By Computer",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=hyperVReplica_CL NOT(state_s:\"Replicating\") runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 }",
+ "Legend": "Number Of VMs With Broken Replication"
+ },
+ "List": {
+ "Query": "Type=hyperVReplica_CL NOT(state_s:\"Replicating\") runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | Measure count() by primaryServer_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count Of Broken Replicas"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "0",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "2",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Hyper-V Replica - Replication Size",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Average Replica Size"
+ },
+ "LineChart": {
+ "Query": "Type=hyperVReplica_CL | EXTEND div(AverageReplicationSize_d,1048576 ) AS AverageReplicationSize_MB | measure avg(AverageReplicationSize_MB) Interval 1HOUR",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "Type=hyperVReplica_CL state_s:\"Replicating\" | EXTEND div(AverageReplicationSize_d,1048576 ) AS AverageReplicationSize_MB | measure avg(AverageReplicationSize_MB) by name_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "VM Name",
+ "Value": "AVG Replica Size"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "30",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "50",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Computers Actively Being Monitored",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=hyperVReplica_CL runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | Dedup primaryServer_s | Select primaryServer_s"
+ },
+ "List": {
+ "Query": "Type=hyperVReplica_CL runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | Dedup primaryServer_s | Select primaryServer_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "Computer"
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "List of queries",
+ "newGroup": false,
+ "preselectedFilters": "Type, Computer",
+ "renderMode": "grid"
+ },
+ "queries": [
+ {
+ "query": "Type=hyperVReplica_CL runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | measure count() by state_s",
+ "displayName": "Number At Each Status"
+ },
+ {
+ "query": "Type=hyperVReplica_CL runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 }",
+ "displayName": "Latest Hyper-V Replica Information"
+ },
+ {
+ "query": "Type=hyperVReplica_CL",
+ "displayName": "All Hyper-V Replica Data"
+ },
+ {
+ "query": "Type=hyperVReplica_CL NOT(state_s:\"Replicating\") runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | Measure count() by primaryServer_s",
+ "displayName": "Current Broken Replicas By Server"
+ },
+ {
+ "query": "Type=hyperVReplica_CL state_s=\"Replicating\" runNumber_d IN { Type=hyperVReplica_CL | measure max(runNumber_d) by runNumber_d | sort runNumber_d DESC | top 1 } | Measure count() by primaryServer_s",
+ "displayName": "Current Successful Replicas By Server"
+ },
+ {
+ "query": "Type=hyperVReplica_CL LastReplicationTime_t NOW-8MINUTES | dedup name_s | measure count() by status_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum",
+ "ArcsToSelect": []
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ],
+ "valueColorMapping": []
+ }
+ },
+ "List": {
+ "Query": "Type:KempStatus_CL (servertype_s=vs OR servertype_s=subvs) enabled_s=\"Y\" status_s!=\"Up\" status_s!='Redirect' | select name_s, status_s | dedup name_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "ColumnsTitle": {
+ "Name": "VS not Up",
+ "Value": ""
+ },
+ "Color": "#0072c6",
+ "operation": "Summary",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#ba141a",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item} Type:KempStatus_CL (servertype_s=vs OR servertype_s=subvs) enabled_s=\"Y\""
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "DoubleNumberBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "TileOne": {
+ "Legend": "Kemp Devices",
+ "Query": "Type:KempDevice_CL | measure countdistinct(Computer) by Computer"
+ },
+ "TileTwo": {
+ "Legend": "Virtual Servers",
+ "Query": "Type:KempStatus_CL | measure countdistinct(name_s) by name_s"
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": true,
+ "Query": "Type:KempDevice_CL",
+ "Message": "The solution needs to be configured for data to be gathered"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "(omsSolutions).customSolution.solutionName",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName",
+ "savedsearchcopy",
+ "schedulescopy",
+ "savedsearchcopyMetric",
+ "schedulescopyMetric",
+ "actioncopy",
+ "actioncopyMetric"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": "",
+ "product": "(omsSolutions).customSolution.product",
+ "Version": "(omsSolutions).customSolution.version"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "referencedResources": [],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-20/(omsSolutions).customSolution.viewName"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertArray)[copyIndex()].query",
+ "displayName": "(alertArray)[copyIndex()].searchName",
+ "category": "(alertArray)[copyIndex()].searchCategory",
+ "version": "(alertArray)[copyIndex()].version"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory",
+ "version": "(alertMetricArray)[copyIndex()].version"
+ }
+ },
+ {
+ "apiVersion": "2015-11-01-preview",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches",
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName))]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName"
+ ],
+ "properties": {
+ "etag": "*",
+ "query": "(alertMetricArray)[copyIndex()].query",
+ "displayName": "(alertMetricArray)[copyIndex()].searchName",
+ "category": "(alertMetricArray)[copyIndex()].searchCategory",
+ "version": "(alertMetricArray)[copyIndex()].version"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName",
+ "savedsearchcopy"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": "(alertArray)[copyIndex()].enabled",
+ "NearRealTime": "(alertArray)[copyIndex()].nearRealTime"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName",
+ "savedsearchcopyMetric"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": "(alertMetricArray)[copyIndex()].enabled",
+ "NearRealTime": "(alertMetricArray)[copyIndex()].nearRealTime"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName",
+ "savedsearchcopyMetric"
+ ],
+ "properties": {
+ "etag": "*",
+ "Interval": "(alertMetricArray)[copyIndex()].scheduleIntervalInMinutes",
+ "QueryTimeSpan": "(alertMetricArray)[copyIndex()].scheduleQueryTimeSpan",
+ "enabled": "(alertMetricArray)[copyIndex()].enabled",
+ "NearRealTime": "(alertMetricArray)[copyIndex()].nearRealTime"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertArray')[copyIndex()].searchCategory), '|', toLower(variables('alertArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertArray')[copyIndex()].searchCategory, '|', variables('alertArray')[copyIndex()].searchName))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName",
+ "savedsearchcopy",
+ "schedulescopy"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertArray)[copyIndex()].alertName",
+ "Description": "(alertArray)[copyIndex()].description",
+ "Severity": "(alertArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertArray)[copyIndex()].operator",
+ "Value": "(alertArray)[copyIndex()].alertTresholdValue"
+ },
+ "ScheduleType": "(alertArray)[copyIndex()].scheduleType",
+ "ScheduleTypeSpecified": "(alertArray)[copyIndex()].scheduleTypeSpecified",
+ "Version": "(alertArray)[copyIndex()].version"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2015-11-01-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName",
+ "savedsearchcopyMetric",
+ "schedulescopyMetric"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "(alertMetricArray)[copyIndex()].triggerCondition",
+ "Operator": "(alertMetricArray)[copyIndex()].triggerOperator",
+ "Value": "(alertMetricArray)[copyIndex()].triggerValue"
+ }
+ },
+ "ScheduleType": "(alertMetricArray)[copyIndex()].scheduleType",
+ "ScheduleTypeSpecified": "(alertMetricArray)[copyIndex()].scheduleTypeSpecified",
+ "Version": "(alertMetricArray)[copyIndex()].version"
+ }
+ },
+ {
+ "name": "[concat(parameters('omsLogAnalyticsWorkspaceName'), '/', tolower(variables('alertMetricArray')[copyIndex()].searchCategory), '|', toLower(variables('alertMetricArray')[copyIndex()].searchName), '/','schedule-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName), '/', 'alert-',uniqueString(resourceGroup().id, deployment().name,parameters('omsLogAnalyticsWorkspaceName'), '/', variables('alertMetricArray')[copyIndex()].searchCategory, '|', variables('alertMetricArray')[copyIndex()].searchName))]",
+ "type": "Microsoft.OperationalInsights/workspaces/savedSearches/schedules/actions",
+ "apiVersion": "2015-11-01-preview",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-20",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-20/(omsSolutions).customSolution.viewName",
+ "savedsearchcopyMetric",
+ "schedulescopyMetric"
+ ],
+ "properties": {
+ "etag": "*",
+ "Type": "Alert",
+ "Name": "(alertMetricArray)[copyIndex()].alertName",
+ "Description": "(alertMetricArray)[copyIndex()].description",
+ "Severity": "(alertMetricArray)[copyIndex()].severity",
+ "Throttling": {
+ "DurationInMinutes": "(alertMetricArray)[copyIndex()].alertThrottleInMinutes"
+ },
+ "Threshold": {
+ "Operator": "(alertMetricArray)[copyIndex()].operator",
+ "Value": "(alertMetricArray)[copyIndex()].alertTresholdValue",
+ "MetricsTrigger": {
+ "TriggerCondition": "(alertMetricArray)[copyIndex()].triggerCondition",
+ "Operator": "(alertMetricArray)[copyIndex()].triggerOperator",
+ "Value": "(alertMetricArray)[copyIndex()].triggerValue"
+ }
+ },
+ "ScheduleType": "(alertMetricArray)[copyIndex()].scheduleType",
+ "ScheduleTypeSpecified": "(alertMetricArray)[copyIndex()].scheduleTypeSpecified",
+ "Version": "(alertMetricArray)[copyIndex()].version"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT777 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT777
new file mode 100644
index 0000000..45d6c30
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT777
@@ -0,0 +1,1477 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-scomacs-solution/azuredeploy.json",
+ "/demos/oms-scomacs-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901011,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-scomacs-solution/azuredeploy.json",
+ "/demos/oms-scomacs-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT777",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT777",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "A valid log analytics workspace name (solution will be added) or provide a name for the new workspace."
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "workspaceRegionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Region of the Log Analytics workspace"
+ },
+ "value": "eastus"
+ },
+ "pricingTier": {
+ "type": "string",
+ "defaultValue": "Standalone",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode"
+ ],
+ "metadata": {
+ "description": "Service Tier: Free, Standalone, or PerNode"
+ }
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "SCOM ACS Dashboards",
+ "solutionName": "[concat('SCOMACSDashboards', '[', parameters('workspaceName'), ']')]",
+ "publisher": "Adin.Ermie@outlook.com",
+ "displayName": "SCOM ACS Dashboards",
+ "description": "This is a pre-built solution for Microsoft OMS (www.microsoft.com/oms).This solution was built from following Wei Ho Lim's 2 articles. This solution requires the OMS Security and Audit solution to be enabled first, as it leverages this collected data.",
+ "author": "Adin.Ermie@outlook.com"
+ }
+ },
+ "SecurityAndAuditSolution": {
+ "Name": "[Concat('Security', '(', parameters('workspaceName'), ')')]",
+ "GalleryName": "Security"
+ }
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "eastus",
+ "properties": {
+ "sku": {
+ "name": "Standalone"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "name": "(SecurityAndAuditSolution).Name",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "id": "Microsoft.OperationsManagement/solutions/(SecurityAndAuditSolution).Name",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ },
+ "plan": {
+ "name": "(SecurityAndAuditSolution).Name",
+ "publisher": "Microsoft",
+ "product": "[Concat('OMSGallery/', variables('SecurityAndAuditSolution').GalleryName)]",
+ "promotionCode": ""
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "DisplayName": "(omsSolutions).customSolution.displayName",
+ "Description": "(omsSolutions).customSolution.description",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Mapping ACS Reports to OMS Search Queries",
+ "Link": {
+ "Label": "More info",
+ "Url": "https://blogs.msdn.microsoft.com/wei_out_there_with_system_center/2016/07/25/mapping-acs-reports-to-oms-search-queries/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Summary",
+ "Content": "This post features a table that shows the mapping between Audit Collection Services (ACS) SSRS reports and search queries used in OMS Log Analytics. \n\nMost of the OMS search queries listed in this post are used to drive the views in this ACS Dashboard in OMS Log Analytics."
+ }
+ ]
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Forensic",
+ "newGroup": false,
+ "preselectedFilters": "Type, Computer",
+ "renderMode": "grid"
+ },
+ "queries": [
+ {
+ "query": "Type=SecurityEvent Computer=\"<>\"",
+ "displayName": "All Events For Specified Computer"
+ },
+ {
+ "query": "All Events For Specified Computer grouped by Activity",
+ "displayName": "All Events For Specified Computer grouped by Activity"
+ },
+ {
+ "query": "Type=SecurityEvent Account=\"<>\"",
+ "displayName": "All Events For Specified User"
+ },
+ {
+ "query": "Type=SecurityEvent Account=\"<>\" | measure count() by Activity",
+ "displayName": "All Events For Specified User grouped by Activity"
+ },
+ {
+ "query": "Type=SecurityEvent Account=\"<>\" | measure count() by Activity",
+ "displayName": "All Events With Specified Event ID"
+ },
+ {
+ "query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Computer",
+ "displayName": "All Events With Specified Event ID grouped by Computer"
+ },
+ {
+ "query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Account",
+ "displayName": "All Events With Specified Event ID grouped by Account"
+ }
+ ]
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "PLANNING: Event Counts and Hourly Distribution",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Hourly Event Distribution"
+ },
+ "LineChart": {
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by TimeGenerated Interval 1Hour",
+ "Callout": {
+ "Title": "Avg per hour",
+ "Operation": "Average"
+ },
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID!=0 | measure count() AS Count by Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Planning: Logon Counts of Privilege Users",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\"",
+ "Legend": "Logon Counts"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Measure Count() by SubjectAccount",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "User Account",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Select SubjectAccount, PrivilegeList"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "System Integrity Check",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Audit Failure",
+ "Query": "Type=SecurityEvent EventID=516 OR EventID=4612 | Select TimeGenerated, Activity, Computer"
+ },
+ "SecondTile": {
+ "Legend": "Audit Log Cleared",
+ "Query": "Type=SecurityEvent EventID=517 OR EventID=1102 | Select TimeGenerated, Activity, Computer"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=517 OR EventID=1102 | measure count() AS EventPerHour interval 1Hour",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Date Audit Log Cleared",
+ "Value": "Count (Hourly Interval)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=517 OR EventID=516 OR EventID=1102 OR EventID=4612 | Select TimeGenerated, Activity, Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Access Violation Related Activities",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Account Locked",
+ "Query": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279"
+ },
+ "SecondTile": {
+ "Legend": "Unsuccessful Logon Attempts",
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | Select TargetAccount, IpAddress, Computer, LogonProcessName, AuthenticationPackageName, LogonTypeName"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | measure count() by TargetAccount",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Account Failed to Logon",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=624 OR EventID=4720 OR EventID=630 OR EventID=4726 | Select TimeGenerated, TargetAccount, Activity, Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Account Management: User Accounts Created Or Deleted",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "User Accounts Created",
+ "Query": "Type=SecurityEvent (EventID=624 OR EventID=4720) | EXTEND SubjectAccount AS CreatedBy | Select TimeGenerated, TargetAccount, CreatedBy, Computer"
+ },
+ "SecondTile": {
+ "Legend": "User Accounts Deleted",
+ "Query": "Type=SecurityEvent (EventID=630 OR EventID=4726) | EXTEND SubjectAccount AS DeletedBy | Select TimeGenerated, TargetAccount, DeletedBy, Computer"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=624 OR EventID=4720 OR EventID=630 OR EventID=4726 | Measure Count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Account Management: Domain and Built-in Administrators Membership Changes",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Member Added",
+ "Query": "Type=SecurityEvent EventID=4728 OR EventID=4732 OR EventID=4756 OR EventID=632 OR EventID=636 OR EventID=660 AND (\"*512\" OR \"S-1-5-32-544\") | Extend \"Add Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer"
+ },
+ "SecondTile": {
+ "Legend": "Member Removed",
+ "Query": "Type=SecurityEvent EventID=4729 OR EventID=4733 OR EventID=4757 OR EventID=633 OR EventID=637 OR EventID=661 AND (\"*512\" OR \"S-1-5-32-544\") Extend \"Remove Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[4728..4729] OR EventID:[4732..4733] OR EventID:[4756..4757] OR EventID:[632..633] OR EventID:[636..637] OR EventID:[660..661] AND (\"*512\" OR \"S-1-5-32-544\") | measure Count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID:[4728..4729] OR EventID:[4732..4733] OR EventID:[4756..4757] OR EventID:[632..633] OR EventID:[636..637] OR EventID:[660..661] AND (\"*512\" OR \"S-1-5-32-544\") | Select TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Account Management: Password Change Attempts by Non-Owner",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount}",
+ "Legend": "Password Change Attempts"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount} | Measure Count() by SubjectAccount",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Changed By",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount} | EXTEND SubjectAccount AS ChangedBy | Select TimeGenerated, Computer, TargetAccount, ChangedBy"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Policy: Account and Audit Policy Changed",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Account Policy Changed",
+ "Query": "Type=SecurityEvent EventID=643 OR EventID=4739 | Select Computer, Activity, TimeGenerated, EventData"
+ },
+ "SecondTile": {
+ "Legend": "Audit Policy Changed",
+ "Query": "Type=SecurityEvent EventID=612 OR EventID=4719 | Select Computer, Activity, TimeGenerated, EventData"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=612 OR EventID=643 OR EventID=4719 OR EventID=4739 | measure count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=612 OR EventID=643 OR EventID=4719 OR EventID=4739 | Select Computer, Activity, TimeGenerated, EventData"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Policy: Object Permissions Changed",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID=4670 | Select TimeGenerated, Activity, Computer, EventData",
+ "Legend": "Object Permissions Changed"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=4670 | measure count() by Computer",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=4670 | Select TimeGenerated, Activity, Computer, EventData"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Policy: Privilege Added Or Removed",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | Select TimeGenerated, Activity, Computer, EventData",
+ "Legend": "Privilege Added Or Removed"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | measure count() by Computer",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | Select TimeGenerated, Activity, Computer, EventData"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Usage: User and Privileged Logons",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "User Logon",
+ "Query": "Type=SecurityEvent EventID=528 OR EventID=540 OR EventID=4624 | Select TimeGenerated, Activity, Computer, IpAddress, AuthenticationPackageName, LogonProcessName, LogonTypeName, TargetAccount"
+ },
+ "SecondTile": {
+ "Legend": "Privileged Logon",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 | Select TimeGenerated, Activity, Computer, SubjectAccount, PrivilegeList"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 OR EventID=528 OR EventID=540 OR EventID=4624 | measure count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=576 OR EventID=4672 OR EventID=528 OR EventID=540 OR EventID=4624"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Usage: Sensitive Security Groups Changes",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | EXTEND TargetUserName As GroupName | Select Activity, GroupName, SubjectAccount, MemberName, TimeGenerated",
+ "Legend": "Sensitive Security Groups Changes"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | measure count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | EXTEND TargetUserName As GroupName | Select Activity, GroupName, SubjectAccount, MemberName, TimeGenerated"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Usage: Object Access",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | Select Computer, Activity, TimeGenerated, EventData",
+ "Legend": "All Object Access Related Audit Event"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | measure count() AS EventPerHour interval 1Hour | sort TimeGenerated desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Date Event Logged",
+ "Value": "Count (Hourly Interval)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | Select Computer, Activity, TimeGenerated, EventData"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "Trend1": {
+ "Legend": "ALL SEC EVENTS",
+ "LegendColor": "#00188f",
+ "ChartQuery": "Type=SecurityEvent EventID!=0",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "Trend2": {
+ "Legend": "ACS SEC EVENTS",
+ "LegendColor": "#0072c6",
+ "ChartQuery": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279 OR EventID:[529..537] OR EventID=539 OR EventID=4625 OR EventID=4728 OR EventID=4732 OR EventID=4756 OR EventID=632 OR EventID=636 OR EventID=660 OR EventID=4729 OR EventID=4733 OR EventID=4757 OR EventID=633 OR EventID=637 OR EventID=661 OR EventID=4723 OR EventID=4724 OR EventID:[627..628] OR EventID=624 OR EventID=630 OR EventID=4726 OR EventID=4720 OR EventID=576 OR EventID=4672 OR EventID=643 OR EventID=4739 OR EventID=612 OR EventID=4719 OR EventID=4670 OR EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] OR EventID=516 OR EventID=4612 OR EventID=517 OR EventID=1102 OR EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 OR EventID=576 OR EventID=4672 OR EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] OR EventID=528 OR EventID=540 OR EventID=4624",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch01",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Account Locked (Details)",
+ "Query": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch02",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Account Locked (Events Count)",
+ "Query": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279 | measure count() by EventID",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch03",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Unsuccessful Logon Attempts (Details)",
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | Select TargetAccount, IpAddress, Computer, LogonProcessName, AuthenticationPackageName, LogonTypeName",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch04",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Unsuccessful Logon Attempts (Target Account Count)",
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | measure count() by TargetAccount",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch05",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: Domain and Built-in Administrators Membership Changes (Member Added)",
+ "Query": "Type=SecurityEvent EventID=4728 OR EventID=4732 OR EventID=4756 OR EventID=632 OR EventID=636 OR EventID=660 AND (\"*512\" OR \"S-1-5-32-544\") | Extend \"Add Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch06",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: Domain and Built-in Administrators Membership Changes (Member Removed)",
+ "Query": "Type=SecurityEvent EventID=4729 OR EventID=4733 OR EventID=4757 OR EventID=633 OR EventID=637 OR EventID=661 AND (\"*512\" OR \"S-1-5-32-544\") | Extend \"Remove Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch07",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: Passwords Change Attempts by Non-Owner",
+ "Query": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount} | EXTEND SubjectAccount AS ChangedBy | Select TimeGenerated, Computer, TargetAccount, ChangedBy",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch08",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: User Accounts Created",
+ "Query": "Type=SecurityEvent (EventID=624 OR EventID=4720) | EXTEND SubjectAccount AS CreatedBy | Select TimeGenerated, TargetAccount, CreatedBy, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch09",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: User Accounts Deleted",
+ "Query": "Type=SecurityEvent (EventID=630 OR EventID=4726) | EXTEND SubjectAccount AS DeletedBy | Select TimeGenerated, TargetAccount, DeletedBy, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch10",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified Computer (Detail)",
+ "Query": "Type=SecurityEvent Computer=\"<>\"",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch11",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified Computer (Activity)",
+ "Query": "Type=SecurityEvent Computer=\"<>\" | measure count() by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch12",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified User (Details)",
+ "Query": "Type=SecurityEvent Account=\"<>\"",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch13",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified User (Activity)",
+ "Query": "Type=SecurityEvent Account=\"<>\" | measure count() by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch14",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events With Specified Event ID (Details)",
+ "Query": "Type=SecurityEvent EventID=\"<>\"",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch15",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events With Specified Event ID (Computer)",
+ "Query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch16",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events With Specified Event ID (Account)",
+ "Query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Account",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch17",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Event Counts",
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch18",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Event Counts by Computer (Activity)",
+ "Query": "Type=SecurityEvent Computer=\"<>\" | measure count() by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch19",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Event Counts by Computer (Events)",
+ "Query": "Type=SecurityEvent Computer=\"<>\" | measure count() by EventID",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch20",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Hourly Event Distribution (Time)",
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by TimeGenerated Interval 1Hour",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch21",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Hourly Event Distribution (Activity)",
+ "Query": "Type=SecurityEvent EventID!=0 AND EventID:[xx..yy] | measure count() AS Count by Activity Interval 1Hour",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch22",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Logon Counts of Privileged Users",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Select SubjectAccount, PrivilegeList",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch23",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Logon Counts of Privileged Users",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Measure Count() by SubjectAccount",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch24",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Account Policy Changed",
+ "Query": "Type=SecurityEvent EventID=643 OR EventID=4739 | Select Computer, Activity, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch25",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Audit Policy Changed",
+ "Query": "Type=SecurityEvent EventID=612 OR EventID=4719 | Select Computer, Activity, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch26",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Object Permissions Changed",
+ "Query": "Type=SecurityEvent EventID=4670 | Select TimeGenerated, Activity, Computer, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch27",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Privilege Added Or Removed",
+ "Query": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | Select TimeGenerated, Activity, Computer, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch28",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "System Integrity: Audit Failure",
+ "Query": "Type=SecurityEvent EventID=516 OR EventID=4612 | Select TimeGenerated, Activity, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch29",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "System Integrity: Audit Log Cleared",
+ "Query": "Type=SecurityEvent EventID=517 OR EventID=1102 | Select Activity, Computer, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch30",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: Object Access",
+ "Query": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | Select Computer, Activity, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch31",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: Privileged logon",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 | Select TimeGenerated, Activity, Computer, SubjectAccount, PrivilegeList",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch32",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: Sensitive Security Groups Changes",
+ "Query": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | EXTEND TargetUserName As GroupName | Select Activity, GroupName, SubjectAccount, MemberName, TimeGenerated",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch33",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: User Logon",
+ "Query": "Type=SecurityEvent EventID=528 OR EventID=540 OR EventID=4624 | Select TimeGenerated, Activity, Computer, IpAddress, AuthenticationPackageName, LogonProcessName, LogonTypeName, TargetAccount",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch34",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "DAC: File Resource Property Changes",
+ "Query": "Type=SecurityEvent EventID=4911 | Select Computer, Activity, TimeGenerated, SubjectAccount, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch35",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "DAC: Central Access Policy For File Changes",
+ "Query": "Type=SecurityEvent EventID=4913 | Select Computer, Activity, TimeGenerated, SubjectAccount, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch36",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "DAC: Object Attribute Changes",
+ "Query": "Type=SecurityEvent EventID=5136 OR EventID=5137 | Select Computer, Activity, TimeGenerated, SubjectAccount, EventData",
+ "Version": 1
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "eastus",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "LogAnalyticsworkspacename": {
+ "value": "[concat('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName'))]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT778 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT778
new file mode 100644
index 0000000..ed76542
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT778
@@ -0,0 +1,1477 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-scomacs-solution/azuredeploy.json",
+ "/demos/oms-scomacs-solution/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962901026,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-scomacs-solution/azuredeploy.json",
+ "/demos/oms-scomacs-solution/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT778",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT778",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "A valid log analytics workspace name (solution will be added) or provide a name for the new workspace."
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "workspaceRegionId": {
+ "type": "string",
+ "metadata": {
+ "description": "Region of the Log Analytics workspace"
+ },
+ "value": "usgovvirginia"
+ },
+ "pricingTier": {
+ "type": "string",
+ "defaultValue": "Standalone",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode"
+ ],
+ "metadata": {
+ "description": "Service Tier: Free, Standalone, or PerNode"
+ }
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "SCOM ACS Dashboards",
+ "solutionName": "[concat('SCOMACSDashboards', '[', parameters('workspaceName'), ']')]",
+ "publisher": "Adin.Ermie@outlook.com",
+ "displayName": "SCOM ACS Dashboards",
+ "description": "This is a pre-built solution for Microsoft OMS (www.microsoft.com/oms).This solution was built from following Wei Ho Lim's 2 articles. This solution requires the OMS Security and Audit solution to be enabled first, as it leverages this collected data.",
+ "author": "Adin.Ermie@outlook.com"
+ }
+ },
+ "SecurityAndAuditSolution": {
+ "Name": "[Concat('Security', '(', parameters('workspaceName'), ')')]",
+ "GalleryName": "Security"
+ }
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "usgovvirginia",
+ "properties": {
+ "sku": {
+ "name": "Standalone"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "location": "usgovvirginia",
+ "name": "(SecurityAndAuditSolution).Name",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "id": "Microsoft.OperationsManagement/solutions/(SecurityAndAuditSolution).Name",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ },
+ "plan": {
+ "name": "(SecurityAndAuditSolution).Name",
+ "publisher": "Microsoft",
+ "product": "[Concat('OMSGallery/', variables('SecurityAndAuditSolution').GalleryName)]",
+ "promotionCode": ""
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "DisplayName": "(omsSolutions).customSolution.displayName",
+ "Description": "(omsSolutions).customSolution.description",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "NewGroup": false,
+ "Color": "#0072c6"
+ },
+ "Header": {
+ "Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAztJREFUeNrUmktoE1EUhqexKj4zJWoaqIpVaVGxKr6ogsaNbhS0YKkKFeKmriwFEaXYnY+FYjeCbmtRRBeuXIlLMe1CXGlduBOt0rS1FaF2/A+ciWMy0yT3njvN/PBtMuHc8899zJ1zp8ZxHEtAKXAE7AdNYBOwGVKO+QQ+gDfgFfii23CNhoHV4CyzWzHGEBgEA2BUKQIZqJAG0A+mHTn9AvfB2krzqeTPi8AVMOWYE92UPrBY2kAzeOeEp/fcZsncYmWMsjaQBdut8LSN22zTnQMXwYwzf5rhHJSGUJdTPeoKyjNoGT0JnoIFCt1/GXwOuNYIbirE/APawbNyhlATmNS4W4fm6NW0Rlxa/baWmsQLwROwXGMC2orXSmkpeMw55lVooAe0aK4gcUMG3NWpJ8hAA+gVWAJtRXPlqpdzLTJwlbvJpAFbID7leK3QwCpwXughFDdsgNTJOecN0A9LhIKbHkIW59rpNdAhuA2wQ+gB0hnXQBLsiqCBnaCeDKTpxUYwcDwkA5TzYTLQKryTDGMOuDoQ44eDFcEhRNpCBtYJB42HaGC9O4klVRuwl1opPNdIa2KaG7dK7nSdgXZWxCwzskOYwPmtxISBuPEQxj9pnAx8NRC4LiQDo2RgJMI98DHGtUpppbgXvNSbMEAv9af5NTKKaicDtK/+ZmCNNi0qpyRpCH3nKnHUNOROYtIj4eDTXP9JMzfAlHAbg966UEKwXE71m70+NSH67bdgFTvhrQv9AA+E7sw98Nbnd/rtjlAbDznn/ypzKc2KnKuDc1TmWgXiT3KuRZU5Oq+6LrQ6BGlWIH6f5TlbK9zM9YNhzQaOKV4rR8M8RD23q7ibG0FOo4snwA6fuC18TVWU08Zyy+snwHNLrbxu8ZJ5F7zkIXUUdNP+XTEelddPgRfFAzZ4wmXAbBUcblAOF1QP+TJVcMSU0T2lPA7G5iH5HLctcsy6AWRDTD7LbYoedNeCS2DcYOK0SnVzW+In9S5JcEtzSfRL/DbHrigfnY896C2LPvQ4B/b4PBRLiZ7KdJg9wLvhMaUCqdDnNgkqtIJ9oBlspqITWMYvSj/5pWnE+ve5zev8hkxDfwUYAP0NkvYTPlJVAAAAAElFTkSuQmCC",
+ "Label": "Mapping ACS Reports to OMS Search Queries",
+ "Link": {
+ "Label": "More info",
+ "Url": "https://blogs.msdn.microsoft.com/wei_out_there_with_system_center/2016/07/25/mapping-acs-reports-to-oms-search-queries/"
+ }
+ },
+ "List": [
+ {
+ "Title": "Summary",
+ "Content": "This post features a table that shows the mapping between Audit Collection Services (ACS) SSRS reports and search queries used in OMS Log Analytics. \n\nMost of the OMS search queries listed in this post are used to drive the views in this ACS Dashboard in OMS Log Analytics."
+ }
+ ]
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Forensic",
+ "newGroup": false,
+ "preselectedFilters": "Type, Computer",
+ "renderMode": "grid"
+ },
+ "queries": [
+ {
+ "query": "Type=SecurityEvent Computer=\"<>\"",
+ "displayName": "All Events For Specified Computer"
+ },
+ {
+ "query": "All Events For Specified Computer grouped by Activity",
+ "displayName": "All Events For Specified Computer grouped by Activity"
+ },
+ {
+ "query": "Type=SecurityEvent Account=\"<>\"",
+ "displayName": "All Events For Specified User"
+ },
+ {
+ "query": "Type=SecurityEvent Account=\"<>\" | measure count() by Activity",
+ "displayName": "All Events For Specified User grouped by Activity"
+ },
+ {
+ "query": "Type=SecurityEvent Account=\"<>\" | measure count() by Activity",
+ "displayName": "All Events With Specified Event ID"
+ },
+ {
+ "query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Computer",
+ "displayName": "All Events With Specified Event ID grouped by Computer"
+ },
+ {
+ "query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Account",
+ "displayName": "All Events With Specified Event ID grouped by Account"
+ }
+ ]
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "PLANNING: Event Counts and Hourly Distribution",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Hourly Event Distribution"
+ },
+ "LineChart": {
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by TimeGenerated Interval 1Hour",
+ "Callout": {
+ "Title": "Avg per hour",
+ "Operation": "Average"
+ },
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID!=0 | measure count() AS Count by Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Planning: Logon Counts of Privilege Users",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\"",
+ "Legend": "Logon Counts"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Measure Count() by SubjectAccount",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "User Account",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Select SubjectAccount, PrivilegeList"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "System Integrity Check",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Audit Failure",
+ "Query": "Type=SecurityEvent EventID=516 OR EventID=4612 | Select TimeGenerated, Activity, Computer"
+ },
+ "SecondTile": {
+ "Legend": "Audit Log Cleared",
+ "Query": "Type=SecurityEvent EventID=517 OR EventID=1102 | Select TimeGenerated, Activity, Computer"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=517 OR EventID=1102 | measure count() AS EventPerHour interval 1Hour",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Date Audit Log Cleared",
+ "Value": "Count (Hourly Interval)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=517 OR EventID=516 OR EventID=1102 OR EventID=4612 | Select TimeGenerated, Activity, Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Access Violation Related Activities",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Account Locked",
+ "Query": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279"
+ },
+ "SecondTile": {
+ "Legend": "Unsuccessful Logon Attempts",
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | Select TargetAccount, IpAddress, Computer, LogonProcessName, AuthenticationPackageName, LogonTypeName"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | measure count() by TargetAccount",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Account Failed to Logon",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=624 OR EventID=4720 OR EventID=630 OR EventID=4726 | Select TimeGenerated, TargetAccount, Activity, Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Account Management: User Accounts Created Or Deleted",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "User Accounts Created",
+ "Query": "Type=SecurityEvent (EventID=624 OR EventID=4720) | EXTEND SubjectAccount AS CreatedBy | Select TimeGenerated, TargetAccount, CreatedBy, Computer"
+ },
+ "SecondTile": {
+ "Legend": "User Accounts Deleted",
+ "Query": "Type=SecurityEvent (EventID=630 OR EventID=4726) | EXTEND SubjectAccount AS DeletedBy | Select TimeGenerated, TargetAccount, DeletedBy, Computer"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=624 OR EventID=4720 OR EventID=630 OR EventID=4726 | Measure Count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Account Management: Domain and Built-in Administrators Membership Changes",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Member Added",
+ "Query": "Type=SecurityEvent EventID=4728 OR EventID=4732 OR EventID=4756 OR EventID=632 OR EventID=636 OR EventID=660 AND (\"*512\" OR \"S-1-5-32-544\") | Extend \"Add Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer"
+ },
+ "SecondTile": {
+ "Legend": "Member Removed",
+ "Query": "Type=SecurityEvent EventID=4729 OR EventID=4733 OR EventID=4757 OR EventID=633 OR EventID=637 OR EventID=661 AND (\"*512\" OR \"S-1-5-32-544\") Extend \"Remove Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[4728..4729] OR EventID:[4732..4733] OR EventID:[4756..4757] OR EventID:[632..633] OR EventID:[636..637] OR EventID:[660..661] AND (\"*512\" OR \"S-1-5-32-544\") | measure Count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID:[4728..4729] OR EventID:[4732..4733] OR EventID:[4756..4757] OR EventID:[632..633] OR EventID:[636..637] OR EventID:[660..661] AND (\"*512\" OR \"S-1-5-32-544\") | Select TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Account Management: Password Change Attempts by Non-Owner",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount}",
+ "Legend": "Password Change Attempts"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount} | Measure Count() by SubjectAccount",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Changed By",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount} | EXTEND SubjectAccount AS ChangedBy | Select TimeGenerated, Computer, TargetAccount, ChangedBy"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Policy: Account and Audit Policy Changed",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "Account Policy Changed",
+ "Query": "Type=SecurityEvent EventID=643 OR EventID=4739 | Select Computer, Activity, TimeGenerated, EventData"
+ },
+ "SecondTile": {
+ "Legend": "Audit Policy Changed",
+ "Query": "Type=SecurityEvent EventID=612 OR EventID=4719 | Select Computer, Activity, TimeGenerated, EventData"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=612 OR EventID=643 OR EventID=4719 OR EventID=4739 | measure count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=612 OR EventID=643 OR EventID=4719 OR EventID=4739 | Select Computer, Activity, TimeGenerated, EventData"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Policy: Object Permissions Changed",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID=4670 | Select TimeGenerated, Activity, Computer, EventData",
+ "Legend": "Object Permissions Changed"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=4670 | measure count() by Computer",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=4670 | Select TimeGenerated, Activity, Computer, EventData"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Policy: Privilege Added Or Removed",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | Select TimeGenerated, Activity, Computer, EventData",
+ "Legend": "Privilege Added Or Removed"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | measure count() by Computer",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Computer",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | Select TimeGenerated, Activity, Computer, EventData"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Usage: User and Privileged Logons",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Legend": "User Logon",
+ "Query": "Type=SecurityEvent EventID=528 OR EventID=540 OR EventID=4624 | Select TimeGenerated, Activity, Computer, IpAddress, AuthenticationPackageName, LogonProcessName, LogonTypeName, TargetAccount"
+ },
+ "SecondTile": {
+ "Legend": "Privileged Logon",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 | Select TimeGenerated, Activity, Computer, SubjectAccount, PrivilegeList"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 OR EventID=528 OR EventID=540 OR EventID=4624 | measure count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=576 OR EventID=4672 OR EventID=528 OR EventID=540 OR EventID=4624"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Usage: Sensitive Security Groups Changes",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | EXTEND TargetUserName As GroupName | Select Activity, GroupName, SubjectAccount, MemberName, TimeGenerated",
+ "Legend": "Sensitive Security Groups Changes"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | measure count() by Activity",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Event Id - Activity",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | EXTEND TargetUserName As GroupName | Select Activity, GroupName, SubjectAccount, MemberName, TimeGenerated"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Usage: Object Access",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Tile": {
+ "Query": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | Select Computer, Activity, TimeGenerated, EventData",
+ "Legend": "All Object Access Related Audit Event"
+ },
+ "List": {
+ "Query": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | measure count() AS EventPerHour interval 1Hour | sort TimeGenerated desc",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Date Event Logged",
+ "Value": "Count (Hourly Interval)"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | Select Computer, Activity, TimeGenerated, EventData"
+ }
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "Trend1": {
+ "Legend": "ALL SEC EVENTS",
+ "LegendColor": "#00188f",
+ "ChartQuery": "Type=SecurityEvent EventID!=0",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "Trend2": {
+ "Legend": "ACS SEC EVENTS",
+ "LegendColor": "#0072c6",
+ "ChartQuery": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279 OR EventID:[529..537] OR EventID=539 OR EventID=4625 OR EventID=4728 OR EventID=4732 OR EventID=4756 OR EventID=632 OR EventID=636 OR EventID=660 OR EventID=4729 OR EventID=4733 OR EventID=4757 OR EventID=633 OR EventID=637 OR EventID=661 OR EventID=4723 OR EventID=4724 OR EventID:[627..628] OR EventID=624 OR EventID=630 OR EventID=4726 OR EventID=4720 OR EventID=576 OR EventID=4672 OR EventID=643 OR EventID=4739 OR EventID=612 OR EventID=4719 OR EventID=4670 OR EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] OR EventID=516 OR EventID=4612 OR EventID=517 OR EventID=1102 OR EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 OR EventID=576 OR EventID=4672 OR EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] OR EventID=528 OR EventID=540 OR EventID=4624",
+ "Calculation": {
+ "Operation": "Sum"
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*"
+ }
+ }
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch01",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Account Locked (Details)",
+ "Query": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch02",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Account Locked (Events Count)",
+ "Query": "Type=SecurityEvent EventID=539 OR EventID=644 OR EventID=4740 OR EventID=6279 | measure count() by EventID",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch03",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Unsuccessful Logon Attempts (Details)",
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | Select TargetAccount, IpAddress, Computer, LogonProcessName, AuthenticationPackageName, LogonTypeName",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch04",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Access Violation: Unsuccessful Logon Attempts (Target Account Count)",
+ "Query": "Type=SecurityEvent EventID:[529..537] OR EventID=539 OR (EventID=4625 AND Status=0xc000006d) | measure count() by TargetAccount",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch05",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: Domain and Built-in Administrators Membership Changes (Member Added)",
+ "Query": "Type=SecurityEvent EventID=4728 OR EventID=4732 OR EventID=4756 OR EventID=632 OR EventID=636 OR EventID=660 AND (\"*512\" OR \"S-1-5-32-544\") | Extend \"Add Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch06",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: Domain and Built-in Administrators Membership Changes (Member Removed)",
+ "Query": "Type=SecurityEvent EventID=4729 OR EventID=4733 OR EventID=4757 OR EventID=633 OR EventID=637 OR EventID=661 AND (\"*512\" OR \"S-1-5-32-544\") | Extend \"Remove Member\" AS Action | Select Action, TargetUserName, Activity, SubjectAccount, MemberName, TimeGenerated, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch07",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: Passwords Change Attempts by Non-Owner",
+ "Query": "Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" TargetAccount NOT IN {Type=SecurityEvent (EventID=4723 OR EventID=4724 OR EventID:[627..628]) AND SubjectAccount!=\"ANONYMOUS LOGON\" | measure count() by SubjectAccount} | EXTEND SubjectAccount AS ChangedBy | Select TimeGenerated, Computer, TargetAccount, ChangedBy",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch08",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: User Accounts Created",
+ "Query": "Type=SecurityEvent (EventID=624 OR EventID=4720) | EXTEND SubjectAccount AS CreatedBy | Select TimeGenerated, TargetAccount, CreatedBy, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch09",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Account Management: User Accounts Deleted",
+ "Query": "Type=SecurityEvent (EventID=630 OR EventID=4726) | EXTEND SubjectAccount AS DeletedBy | Select TimeGenerated, TargetAccount, DeletedBy, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch10",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified Computer (Detail)",
+ "Query": "Type=SecurityEvent Computer=\"<>\"",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch11",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified Computer (Activity)",
+ "Query": "Type=SecurityEvent Computer=\"<>\" | measure count() by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch12",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified User (Details)",
+ "Query": "Type=SecurityEvent Account=\"<>\"",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch13",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events For Specified User (Activity)",
+ "Query": "Type=SecurityEvent Account=\"<>\" | measure count() by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch14",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events With Specified Event ID (Details)",
+ "Query": "Type=SecurityEvent EventID=\"<>\"",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch15",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events With Specified Event ID (Computer)",
+ "Query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch16",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Forensic: All Events With Specified Event ID (Account)",
+ "Query": "Type=SecurityEvent EventID=\"<>\" | measure count() by Account",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch17",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Event Counts",
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch18",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Event Counts by Computer (Activity)",
+ "Query": "Type=SecurityEvent Computer=\"<>\" | measure count() by Activity",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch19",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Event Counts by Computer (Events)",
+ "Query": "Type=SecurityEvent Computer=\"<>\" | measure count() by EventID",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch20",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Hourly Event Distribution (Time)",
+ "Query": "Type=SecurityEvent EventID!=0 | measure count() AS Count by TimeGenerated Interval 1Hour",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch21",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Hourly Event Distribution (Activity)",
+ "Query": "Type=SecurityEvent EventID!=0 AND EventID:[xx..yy] | measure count() AS Count by Activity Interval 1Hour",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch22",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Logon Counts of Privileged Users",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Select SubjectAccount, PrivilegeList",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch23",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Planning: Logon Counts of Privileged Users",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 AND SubjectDomainName!=\"NT AUTHORITY\" AND AccountType!=\"Machine\" | Measure Count() by SubjectAccount",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch24",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Account Policy Changed",
+ "Query": "Type=SecurityEvent EventID=643 OR EventID=4739 | Select Computer, Activity, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch25",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Audit Policy Changed",
+ "Query": "Type=SecurityEvent EventID=612 OR EventID=4719 | Select Computer, Activity, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch26",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Object Permissions Changed",
+ "Query": "Type=SecurityEvent EventID=4670 | Select TimeGenerated, Activity, Computer, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch27",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Policy: Privilege Added Or Removed",
+ "Query": "Type=SecurityEvent EventID:[608..609] OR EventID:[621..622] OR EventID:[4704..4705] | Select TimeGenerated, Activity, Computer, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch28",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "System Integrity: Audit Failure",
+ "Query": "Type=SecurityEvent EventID=516 OR EventID=4612 | Select TimeGenerated, Activity, Computer",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch29",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "System Integrity: Audit Log Cleared",
+ "Query": "Type=SecurityEvent EventID=517 OR EventID=1102 | Select Activity, Computer, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch30",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: Object Access",
+ "Query": "Type=SecurityEvent EventID=560 OR EventID=567 OR EventID=4656 OR EventID=4663 | Select Computer, Activity, TimeGenerated, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch31",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: Privileged logon",
+ "Query": "Type=SecurityEvent EventID=576 OR EventID=4672 | Select TimeGenerated, Activity, Computer, SubjectAccount, PrivilegeList",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch32",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: Sensitive Security Groups Changes",
+ "Query": "Type=SecurityEvent EventID:[4727..4735] OR EventID=4737 OR EventID:[4754..4758] OR EventID:[631..639] OR EventID=641 OR EventID:[658..662] | EXTEND TargetUserName As GroupName | Select Activity, GroupName, SubjectAccount, MemberName, TimeGenerated",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch33",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "Usage: User Logon",
+ "Query": "Type=SecurityEvent EventID=528 OR EventID=540 OR EventID=4624 | Select TimeGenerated, Activity, Computer, IpAddress, AuthenticationPackageName, LogonProcessName, LogonTypeName, TargetAccount",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch34",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "DAC: File Resource Property Changes",
+ "Query": "Type=SecurityEvent EventID=4911 | Select Computer, Activity, TimeGenerated, SubjectAccount, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch35",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "DAC: Central Access Policy For File Changes",
+ "Query": "Type=SecurityEvent EventID=4913 | Select Computer, Activity, TimeGenerated, SubjectAccount, EventData",
+ "Version": 1
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "ACSSavedSearch36",
+ "type": "savedSearches",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Category": "ACS Report Queries",
+ "ETag": "*",
+ "DisplayName": "DAC: Object Attribute Changes",
+ "Query": "Type=SecurityEvent EventID=5136 OR EventID=5137 | Select Computer, Activity, TimeGenerated, SubjectAccount, EventData",
+ "Version": 1
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "LogAnalyticsworkspacename": {
+ "value": "[concat('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName'))]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT779 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT779
new file mode 100644
index 0000000..d8c0f09
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT779
@@ -0,0 +1,241 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-servicebus-solution/nestedtemplates/addMultipleSubscriptions.json"
+ ],
+ "timestamp": 1642962901085,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-servicebus-solution/nestedtemplates/addMultipleSubscriptions.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT779",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT779",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "OMSWorkspaceId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the OMS workspace ID"
+ }
+ },
+ "OMSWorkspaceKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the OMS workspace key"
+ }
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your Automation Account"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify region for your automation account"
+ }
+ },
+ "jobGuid": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "GUID for the schedule creation - create a unique before deploy"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "assets": {
+ "psModules": {
+ "ingestionAPI": {
+ "name": "OMSIngestionAPI",
+ "uri": "https://raw.githubusercontent.com/tianderturpijn/OMS/master/ServiceBus/modules/OMSIngestionAPI.zip"
+ }
+ },
+ "aaVariables": {
+ "OMSWorkspaceId": {
+ "name": "OMSWorkspaceId",
+ "description": "Workspace ID for the Log Analytics workspace"
+ },
+ "OMSWorkspaceKey": {
+ "name": "OMSWorkspaceKey",
+ "description": "Primary key for the Log Analytics workspace"
+ },
+ "AzureSubscriptionId": {
+ "name": "AzureSubscriptionId",
+ "description": "Azure subscription Id"
+ }
+ },
+ "runbooks": {
+ "servicebusManagement": {
+ "description": "",
+ "Id": "",
+ "ingestFrequency": "hour",
+ "ingestInterval": 1,
+ "ingestScheduleName": "IngestAPISchedule",
+ "name": "servicebusIngestion",
+ "type": "PowerShell",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/servicebusIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "omsAutomationAccountName",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2015-10-31",
+ "location": "location",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "OMSWorkspaceId",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "(assets).aaVariables.OMSWorkspaceId.description",
+ "value": "\"OMSWorkspaceId\""
+ }
+ },
+ {
+ "name": "OMSWorkspaceKey",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "",
+ "value": "\"OMSWorkspaceKey\""
+ }
+ },
+ {
+ "name": "(assets).aaVariables.AzureSubscriptionId.name",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "description": "(assets).aaVariables.AzureSubscriptionId.description",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "(assets).psModules.ingestionAPI.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Variables/omsAutomationAccountName/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/Variables/omsAutomationAccountName/(assets).aaVariables.OMSWorkspaceKey.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.ingestionAPI.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).runbooks.servicebusManagement.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/Modules/omsAutomationAccountName/(assets).psModules.ingestionAPI.name",
+ "Microsoft.Automation/automationAccounts/Variables/omsAutomationAccountName/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/Variables/omsAutomationAccountName/(assets).aaVariables.OMSWorkspaceKey.name"
+ ],
+ "properties": {
+ "runbookType": "(assets).runbooks.servicebusManagement.type",
+ "logProgress": true,
+ "logVerbose": false,
+ "description": "(assets).runbooks.servicebusManagement.description",
+ "publishContentLink": {
+ "uri": "(assets).runbooks.servicebusManagement.url",
+ "version": "(assets).runbooks.servicebusManagement.version"
+ }
+ }
+ },
+ {
+ "name": "(assets).runbooks.servicebusManagement.ingestScheduleName",
+ "type": "schedules",
+ "apiVersion": "2015-10-31",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName",
+ "Microsoft.Automation/automationAccounts/runbooks/omsAutomationAccountName/(assets).runbooks.servicebusManagement.name"
+ ],
+ "properties": {
+ "description": "OMS Ingestion API Scheduler",
+ "startTime": "",
+ "isEnabled": true,
+ "interval": "(assets).runbooks.servicebusManagement.ingestInterval",
+ "frequency": "(assets).runbooks.servicebusManagement.ingestFrequency"
+ }
+ },
+ {
+ "name": "",
+ "type": "jobSchedules",
+ "apiVersion": "2015-10-31",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts/schedules/omsAutomationAccountName/(assets).runbooks.servicebusManagement.ingestScheduleName",
+ "Microsoft.Automation/automationAccounts/runbooks/omsAutomationAccountName/(assets).runbooks.servicebusManagement.name",
+ "Microsoft.Automation/automationAccounts//omsAutomationAccountName"
+ ],
+ "properties": {
+ "schedule": {
+ "name": "(assets).runbooks.servicebusManagement.ingestScheduleName"
+ },
+ "runbook": {
+ "name": "(assets).runbooks.servicebusManagement.name"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT78 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT78
new file mode 100644
index 0000000..71402ca
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT78
@@ -0,0 +1,320 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-ds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885537,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-ds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT78",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT78",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "singleQuote": "'",
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "GEN-UNIQUE-10-dn",
+ "nicName": "GEN-UNIQUE-10-dn-nic",
+ "publicIPAddressName": "GEN-UNIQUE-10-dn-publicIP",
+ "securityGroupName": "GEN-UNIQUE-10-dn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "GEN-UNIQUE-10-dn-sg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-10-dncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE-10-dn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ ],
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2017-03-30",
+ "name": "GEN-UNIQUE-10-dncopyIndex()",
+ "plan": {
+ "name": "cloudera-centos-6",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-6"
+ },
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": false
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-6",
+ "sku": "cloudera-centos-6",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk1",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk2",
+ "diskSizeGB": 1023,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk3",
+ "diskSizeGB": 1023,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk4",
+ "diskSizeGB": 1023,
+ "lun": 3,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk5",
+ "diskSizeGB": 1023,
+ "lun": 4,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk6",
+ "diskSizeGB": 1023,
+ "lun": 5,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-10-dncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE-10-dncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-datanode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh ', variables('singleQuote'), variables('masterIP'), variables('singleQuote'), ' ', variables('singleQuote'), variables('workerIP'), variables('singleQuote'), ' ', variables('singleQuote'), parameters('dnsNamePrefix'), variables('singleQuote'), ' ', variables('singleQuote'), reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').masterNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').dataNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('vmSpec').adminUsername, variables('singleQuote'), ' ', 'datanode', ' >> /var/log/cloudera-azure-initialize.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT780 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT780
new file mode 100644
index 0000000..6366167
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT780
@@ -0,0 +1,1118 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-servicebus-solution/azuredeploy.json",
+ "/demos/oms-servicebus-solution/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901095,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-servicebus-solution/azuredeploy.json",
+ "/demos/oms-servicebus-solution/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT780",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT780",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your existing OMS Automation account to store the configuration"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specify the region for your OMS workspace"
+ }
+ },
+ "omsSku": {
+ "type": "string",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Select the SKU for your workspace"
+ },
+ "value": "free"
+ },
+ "omsAutomationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of your Automation Account"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "jobGuid": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "GUID for the schedule creation - create a unique before deploy"
+ },
+ "value": "GEN-GUID"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "assets": {
+ "psModules": {
+ "ingestionAPI": {
+ "name": "OMSIngestionAPI",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/omsingestionapi.1.5.0.nupkg"
+ },
+ "azureStorage": {
+ "name": "Azure.Storage",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azure.storage.2.8.0.nupkg"
+ },
+ "azureRmAutomation": {
+ "name": "AzureRM.Automation",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.automation.2.8.0.nupkg"
+ },
+ "azureRmCompute": {
+ "name": "AzureRM.Compute",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.compute.2.9.0.nupkg"
+ },
+ "azureRmProfile": {
+ "name": "AzureRM.Profile",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.profile.2.8.0.nupkg"
+ },
+ "azureRmResources": {
+ "name": "AzureRM.Resources",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.resources.3.8.0.nupkg"
+ },
+ "azureRmSql": {
+ "name": "AzureRM.Sql",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.sql.2.8.0.nupkg"
+ },
+ "azure": {
+ "name": "Azure",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azure.3.8.0.nupkg"
+ },
+ "azureRmServicebus": {
+ "name": "AzureRM.Servicebus",
+ "uri": "https://devopsgallerystorage.blob.core.windows.net/packages/azurerm.servicebus.0.2.0.nupkg"
+ }
+ },
+ "aaVariables": {
+ "OMSWorkspaceId": {
+ "name": "OMSWorkspaceId",
+ "description": "Workspace ID for the Log Analytics workspace"
+ },
+ "OMSWorkspaceKey": {
+ "name": "OMSWorkspaceKey",
+ "description": "Primary key for the Log Analytics workspace"
+ },
+ "AzureSubscriptionId": {
+ "name": "AzureSubscriptionId",
+ "description": "Azure subscription Id"
+ }
+ },
+ "runbooks": {
+ "scheduleRunbook": {
+ "name": "scheduleIngestion",
+ "version": "1.0.0.0",
+ "description": "schedule runbook",
+ "type": "PowerShell",
+ "Id": "",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/scheduleIngestion.ps1', parameters('_artifactsLocationSasToken')))]",
+ "ingestScheduleName": "ingestAPISchedule"
+ },
+ "ingestionRunbook": {
+ "name": "servicebusIngestion",
+ "version": "1.0.0.0",
+ "description": "runbook to ingest service bus data",
+ "type": "PowerShell",
+ "Id": "",
+ "url": "[uri(parameters('_artifactsLocation'), concat('scripts/servicebusIngestion.ps1', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ },
+ "omsSolutions": {
+ "customSolution": {
+ "name": "Azure Service Bus",
+ "solutionName": "[concat('Azure Service Bus', '[', parameters('omsWorkspaceName'), ']')]",
+ "publisher": "tiandert@microsoft.com",
+ "displayName": "Azure Service Bus",
+ "description": "Azure Service Bus Monitoring",
+ "author": "tiandert@microsoft.com"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "GEN-UNIQUE",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "free"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "id": "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE/(omsSolutions).customSolution.name",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "Id": "Azure Service Bus Analytics",
+ "Name": "Azure Service Bus Analytics",
+ "Author": "tiandert@microsoft.com",
+ "Source": "Local",
+ "Version": 1,
+ "Dashboard": [
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Queue Messages",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Messages",
+ "Subtitle": "Last 24hrs"
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS| measure max(ActiveMessageCount_d) by QueueName_s interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-15MINUTES | measure max(ActiveMessageCount_d) by QueueName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Sum",
+ "ColumnsTitle": {
+ "Name": "Queue (last 15mins)",
+ "Value": "Nr of Messages"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Queue Dead Letters",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Dead Letter Count",
+ "Subtitle": "Last 24hrs"
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS| measure max(DeadLetterMessageCount_d) by QueueName_s interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-30MINUTES | Measure avg(DeadLetterMessageCount_d) as DeadLetterMessageCount by QueueName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Sum",
+ "ColumnsTitle": {
+ "Name": "Queue (last 30mins)",
+ "Value": "Nr of Messages"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Queue Scheduled Messages",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Scheduled Messages",
+ "Subtitle": "Last 24hrs"
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS| measure max(ScheduledMessageCount_d) by QueueName_s interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-1HOUR | Measure avg(ScheduledMessageCount_d) as DeadLetterMessageCount by QueueName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Queue (last 1hr)",
+ "Value": "Nr of Messages"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Queue Free Space %",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Queue Free Space Remaining (last 24hrs)",
+ "Subtitle": ""
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS | measure count() by QueueName_s,QueueFreeSpacePercentage_s interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-30MINUTES | measure countdistinct(QueueFreeSpacePercentage_s) by QueueName_s,QueueFreeSpacePercentage_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Last Sample",
+ "ColumnsTitle": {
+ "Name": "Queue (last 30mins)",
+ "Value": "Samples"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": true,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Topic Messages",
+ "newGroup": true,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Active Messages",
+ "Subtitle": "Last 24hrs"
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS| measure max(ActiveMessageCount_d) by TopicName_s interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-30MINUTES | measure max(ActiveMessageCount_d) by TopicName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Topic (last 30mins)",
+ "Value": "Nr of Messages"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Topic Dead Letters",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Dead Letter Count",
+ "Subtitle": "Last 24hrs"
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS| measure max(DeadLetterMessageCount_d) by TopicName_s interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-30MINUTES | Measure avg(DeadLetterMessageCount_d) as DeadLetterMessageCount by TopicName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Topic (last 30mins)",
+ "Value": "Nr of Messages"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Topic Scheduled Messages",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Scheduled Messages",
+ "Subtitle": "Last 24hrs"
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS| measure max(ScheduledMessageCount_d) by TopicName_s interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-30MINUTES | Measure avg(ScheduledMessageCount_d) as ScheduledMessageCount by TopicName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Topic",
+ "Value": "Nr of Messages"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "LineChartBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Topic Free Space %",
+ "newGroup": false,
+ "icon": "",
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Free Space Remaining",
+ "Subtitle": "Last 24hrs"
+ },
+ "LineChart": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-24HOURS | measure count() by TopicName_s,TopicFreeSpacePercentage_d interval 15MINUTES",
+ "yAxis": {
+ "isLogarithmic": false,
+ "units": {
+ "baseUnitType": "",
+ "baseUnit": "",
+ "displayUnit": ""
+ },
+ "customLabel": ""
+ }
+ },
+ "List": {
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-30MINUTES | measure countdistinct(TopicFreeSpacePercentage_s) by TopicName_s,TopicFreeSpacePercentage_d",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Topic",
+ "Value": "Samples"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NameDSVSeparator": "",
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Id": "NotableQueriesBuilderBlade",
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Azure Service Bus Queries",
+ "newGroup": true,
+ "preselectedFilters": "Type, Computer",
+ "renderMode": "grid"
+ },
+ "queries": [
+ {
+ "query": "Type=servicebus_CL",
+ "displayName": "All Service Bus data"
+ },
+ {
+ "query": "Type:servicebus_CL | measure count() by ServiceBusName_s",
+ "displayName": "All Service Bus namespaces"
+ },
+ {
+ "query": "Type:servicebus_CL | Measure count() by QueueName_s",
+ "displayName": "List of Queues"
+ },
+ {
+ "query": "Type:servicebus_CL | Measure count() by ActiveMessageCount_d",
+ "displayName": "Active Message Count"
+ },
+ {
+ "query": "Type:servicebus_CL | Measure count() by DeadLetterMessageCount_d",
+ "displayName": "Deadletter Count"
+ },
+ {
+ "query": "Type=servicebus_CL SubscriptionName_s=* | Select TopicName_s,SubscriptionName_s | dedup SubscriptionName_s",
+ "displayName": "All Topic Subscriptions"
+ },
+ {
+ "query": "Type=servicebus_CL QueueFreeSpacePercentage_s>0 | Select QueueName_s,QueueFreeSpacePercentage_s | dedup QueueName_s",
+ "displayName": "Queue Freespace"
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Id": "DoubleNumberBuilderTile",
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "TileOne": {
+ "Legend": "Azure Service Bus Queue(s)",
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-1HOURS | measure count() by QueueName_s"
+ },
+ "TileTwo": {
+ "Legend": "Azure Service Bus Topic(s)",
+ "Query": "Type=servicebus_CL TimeGenerated>NOW-1HOURS | measure count() by TopicName_s"
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": true,
+ "Query": "Type=servicebus_CL",
+ "Message": "Waiting on the initial Service Bus data ingestion"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2015-10-31",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "name": "(assets).aaVariables.OMSWorkspaceId.name",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "description": "(assets).aaVariables.OMSWorkspaceId.description",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2020-08-01').customerId,'\"')]"
+ }
+ },
+ {
+ "name": "(assets).aaVariables.OMSWorkspaceKey.name",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "description": "Remote file for the passphrase",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName')), '2020-08-01').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "(assets).aaVariables.AzureSubscriptionId.name",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "description": "(assets).aaVariables.AzureSubscriptionId.description",
+ "value": "[concat('\"',subscription().subscriptionId,'\"')]"
+ }
+ },
+ {
+ "name": "(assets).psModules.ingestionAPI.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.ingestionAPI.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azureRmProfile.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azureRmProfile.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azureStorage.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureRmProfile.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azureStorage.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azureRmAutomation.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureStorage.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azureRmAutomation.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azureRmCompute.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureRmAutomation.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azureRmCompute.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azureRmResources.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureRmAutomation.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azureRmResources.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azureRmSql.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureRmAutomation.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azureRmSql.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azure.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureRmAutomation.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azure.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).psModules.azureRmServicebus.name",
+ "type": "Modules",
+ "apiVersion": "2015-10-31",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureRmAutomation.name"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(assets).psModules.azureRmServicebus.uri"
+ }
+ }
+ },
+ {
+ "name": "(assets).runbooks.scheduleRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/modules/GEN-UNIQUE-10/(assets).psModules.azureRmServicebus.name"
+ ],
+ "properties": {
+ "runbookType": "(assets).runbooks.scheduleRunbook.type",
+ "logProgress": "true",
+ "logVerbose": false,
+ "description": "(assets).runbooks.scheduleRunbook.description",
+ "publishContentLink": {
+ "uri": "(assets).runbooks.scheduleRunbook.url",
+ "version": "(assets).runbooks.scheduleRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(assets).runbooks.ingestionRunbook.name",
+ "type": "runbooks",
+ "apiVersion": "2015-10-31",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "runbookType": "(assets).runbooks.ingestionRunbook.type",
+ "logProgress": "true",
+ "logVerbose": false,
+ "description": "(assets).runbooks.ingestionRunbook.description",
+ "publishContentLink": {
+ "uri": "(assets).runbooks.ingestionRunbook.url",
+ "version": "(assets).runbooks.ingestionRunbook.version"
+ }
+ }
+ },
+ {
+ "name": "(assets).runbooks.scheduleRunbook.ingestScheduleName",
+ "type": "schedules",
+ "apiVersion": "2015-10-31",
+ "properties": {
+ "description": "This schedule is intended to run only once to invoke a runbook which will create the actual schedules, after that it will be expired and can be safely deleted",
+ "startTime": "",
+ "expiryTime": "",
+ "isEnabled": true,
+ "frequency": "OneTime"
+ },
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/runbooks/GEN-UNIQUE-10/(assets).runbooks.scheduleRunbook.name"
+ ]
+ },
+ {
+ "name": "GEN-GUID",
+ "type": "jobSchedules",
+ "apiVersion": "2015-10-31",
+ "properties": {
+ "runbook": {
+ "name": "(assets).runbooks.scheduleRunbook.Name"
+ },
+ "schedule": {
+ "name": "(assets).runbooks.scheduleRunbook.ingestScheduleName"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10",
+ "Microsoft.Automation/automationAccounts/runbooks/GEN-UNIQUE-10/(assets).runbooks.scheduleRunbook.name",
+ "Microsoft.Automation/automationAccounts/schedules/GEN-UNIQUE-10/(assets).runbooks.scheduleRunbook.ingestScheduleName"
+ ]
+ },
+ {
+ "name": "AzureAutomationResourceGroup",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "properties": {
+ "description": "The name of the resource group",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "[concat('\"',resourceGroup().name,'\"')]"
+ },
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10"
+ ]
+ },
+ {
+ "name": "AzureAutomationAccount",
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "properties": {
+ "description": "The name of the Azure Automation Account",
+ "isEncrypted": false,
+ "type": "string",
+ "value": "\"GEN-UNIQUE-10\""
+ },
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-10"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE/(omsSolutions).customSolution.name",
+ "Microsoft.Automation/automationAccounts/schedules/GEN-UNIQUE-10/(assets).runbooks.scheduleRunbook.ingestScheduleName"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "referencedResources": [
+ "Microsoft.Automation/automationAccounts/variables//GEN-UNIQUE-10/(assets).aaVariables.AzureSubscriptionId.name",
+ "Microsoft.Automation/automationAccounts/variables//GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceId.name",
+ "Microsoft.Automation/automationAccounts/variables//GEN-UNIQUE-10/(assets).aaVariables.OMSWorkspaceKey.name"
+ ],
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE/(omsSolutions).customSolution.name"
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT781 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT781
new file mode 100644
index 0000000..52907ca
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT781
@@ -0,0 +1,661 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/oms-vmm-analytics/azuredeploy.json",
+ "/demos/oms-vmm-analytics/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901114,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/oms-vmm-analytics/azuredeploy.json",
+ "/demos/oms-vmm-analytics/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT781",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT781",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of the OMS workspace"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specify the region for all resources"
+ }
+ },
+ "pricingTier": {
+ "type": "string",
+ "defaultValue": "Free",
+ "metadata": {
+ "description": "Specify the pricing tier"
+ },
+ "value": "perNode"
+ },
+ "automationName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of the Azure Automation account"
+ },
+ "value": "GEN-UNIQUE-20"
+ },
+ "vmmServers": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the comma seperated list of the on-prem VMM server(s)"
+ },
+ "value": "GEN-UNIQUE-30"
+ }
+ },
+ "variables": {
+ "omsSolutions": {
+ "customSolution": {
+ "name": "VMM Analytics",
+ "solutionName": "[concat('VMMAnalytics', '[', parameters('workspaceName'), ']')]",
+ "publisher": "veharshv@microsoft.com",
+ "displayName": "VMM Analytics",
+ "description": "Monitor and analyze your VMM jobs",
+ "author": "veharshv@microsoft.com"
+ }
+ },
+ "omsWorkspaceId": "workspaceId",
+ "omsWorkspaceKey": "workspaceKey",
+ "vmmServersVariable": "vmmServers",
+ "lastRunTimeVariable": "lastRunTime",
+ "runbooks": {
+ "vmmAnalytics": {
+ "name": "vmmanalytics",
+ "version": "1.0.0.0",
+ "description": "Runbook to automatically ingest VMM Job data and events into OMS Log Analytics",
+ "type": "PowerShell",
+ "uri": "https://raw.githubusercontent.com/krnese/AzureDeploy/master/OMS/MSOMS/Solutions/vmm/scripts/vmmanalytics.ps1"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-06-01",
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "perNode"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-11-01-preview",
+ "name": "(omsSolutions).customSolution.name",
+ "type": "views",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "Name": "(omsSolutions).customSolution.name",
+ "DisplayName": "(omsSolutions).customSolution.displayName",
+ "Description": "(omsSolutions).customSolution.description",
+ "Author": "(omsSolutions).customSolution.author",
+ "Source": "Local",
+ "Dashboard": [
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Error Distribution by VMM Server",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Errors"
+ },
+ "Donut": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!=\"Success (0)\" | measure count() by VMMServer_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!=\"Success (0)\" |measure count() by VMMServer_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "VMM Server",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" {selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Errors over time",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Errors over time"
+ },
+ "LineChart": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" | measure count() by ErrorInfo_s| display linechart ",
+ "Callout": {
+ "Title": "Avg per 30",
+ "Operation": "Average"
+ },
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" | measure count() by ErrorInfo_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Type",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Data type distribution",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Data types over time"
+ },
+ "LineChart": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" |measure count() by TimeGenerated, ErrorInfo_s, VMMServer_s interval 15minutes | display linechart",
+ "yAxis": {
+ "isLogarithmic": false
+ }
+ },
+ "List": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" |measure count() by TimeGenerated, ErrorInfo_s, VMMServer_s interval 15minutes | display linechart",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Type",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" {selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMM Failed Jobs",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Failed Jobs"
+ },
+ "Donut": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" | measure count() by JobName_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" | measure count() by JobName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Jobs",
+ "Value": "Failed"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" {selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "Distribution by Errors",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Errors"
+ },
+ "Donut": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" | measure count() by ErrorInfo_s",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Type=VMMjobs_CL ErrorInfo_s!= \"Success (0)\" | measure count() by ErrorInfo_s",
+ "HideGraph": false,
+ "enableSparklines": true,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Errors",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "Type=VMMjobs_CL {selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "VMM Insights - Jobs",
+ "newGroup": false,
+ "useIcon": false
+ },
+ "Header": {
+ "Title": "Total Jobs"
+ },
+ "Donut": {
+ "Query": "Type:VMMjobs_CL | measure Count() by JobName_s",
+ "CenterLegend": {
+ "Text": "Jobs",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "List": {
+ "Query": "Type=VMMjobs_CL | measure Count() by JobName_s",
+ "HideGraph": false,
+ "enableSparklines": false,
+ "operation": "Summary",
+ "ColumnsTitle": {
+ "Name": "Jobs",
+ "Value": "Count"
+ },
+ "Color": "#0072c6",
+ "thresholds": {
+ "isEnabled": false,
+ "values": [
+ {
+ "name": "Normal",
+ "threshold": "Default",
+ "color": "#009e49",
+ "isDefault": true
+ },
+ {
+ "name": "Warning",
+ "threshold": "60",
+ "color": "#fcd116",
+ "isDefault": false
+ },
+ {
+ "name": "Error",
+ "threshold": "90",
+ "color": "#ba141a",
+ "isDefault": false
+ }
+ ]
+ },
+ "NavigationQuery": "{selected item}"
+ }
+ }
+ },
+ {
+ "Type": "Blade",
+ "Version": 0,
+ "Configuration": {
+ "General": {
+ "title": "List of queries",
+ "newGroup": false,
+ "preselectedFilters": "Type, Computer",
+ "renderMode": "default"
+ },
+ "queries": [
+ {
+ "query": "Type=VMMjobs_CL | measure count(), percentile25(Duration_d) as Perc25, percentile50(Duration_d) as Perc50, percentile75(Duration_d) as Perc75, percentile90(Duration_d) as Perc90 by JobName_s",
+ "displayName": "Performance analysis (All runs)"
+ },
+ {
+ "query": "Type=VMMjobs_CL AND ErrorInfo_s= \"Success (0)\" | measure count(), percentile25(Duration_d) as Perc25, percentile50(Duration_d) as Perc50, percentile75(Duration_d) as Perc75, percentile90(Duration_d) as Perc90 by JobName_s",
+ "displayName": "Performance analysis (Successful runs)"
+ },
+ {
+ "query": "Type=VMMjobs_CL | measure count() by VMMServer_s, JobName_s, Status_s | sort VMMServer_s, JobName_s, Status_s",
+ "displayName": "Job failure analysis for each job type and host"
+ }
+ ]
+ }
+ }
+ ],
+ "OverviewTile": {
+ "Type": "OverviewTile",
+ "Version": 0,
+ "Configuration": {
+ "Donut": {
+ "Query": "Type=VMMjobs_CL | measure count() by Type",
+ "CenterLegend": {
+ "Text": "Total",
+ "Operation": "Sum"
+ },
+ "Options": {
+ "colors": [
+ "#00188f",
+ "#0072c6",
+ "#00bcf2"
+ ]
+ }
+ },
+ "Advanced": {
+ "DataFlowVerification": {
+ "Enabled": false,
+ "Query": "*"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "Microsoft.OperationalInsights/workspaces/views/GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ],
+ "plan": {
+ "name": "(omsSolutions).customSolution.solutionName",
+ "product": "(omsSolutions).customSolution.name",
+ "publisher": "(omsSolutions).customSolution.publisher",
+ "promotionCode": ""
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10",
+ "containedResources": [
+ "Microsoft.OperationalInsights/workspaces/views//GEN-UNIQUE-10/(omsSolutions).customSolution.name"
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2015-10-31",
+ "name": "GEN-UNIQUE-20",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE-10"
+ ],
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "type": "variables",
+ "apiVersion": "2015-10-31",
+ "name": "workspaceId",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "OMS Workspace Id",
+ "value": "[concat('\"',reference(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName')),'2021-06-01').customerId,'\"')]"
+ }
+ },
+ {
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "name": "lastRunTime",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "LastRunTime variable"
+ }
+ },
+ {
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "name": "vmmServers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "VMMServers",
+ "value": "\"GEN-UNIQUE-30\""
+ }
+ },
+ {
+ "type": "variables",
+ "apiVersion": "2021-04-01",
+ "name": "workspaceKey",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20"
+ ],
+ "properties": {
+ "description": "OMS Workspace key",
+ "value": "[concat('\"',listKeys(resourceId('Microsoft.OperationalInsights/workspaces/', parameters('workspaceName')), '2021-06-01').primarySharedKey,'\"')]"
+ }
+ },
+ {
+ "name": "(runbooks).vmmAnalytics.name",
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Automation/automationAccounts//GEN-UNIQUE-20",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-20/workspaceId",
+ "Microsoft.Automation/automationAccounts/variables/GEN-UNIQUE-20/workspaceKey"
+ ],
+ "properties": {
+ "runbookType": "(runbooks).vmmAnalytics.type",
+ "logProgress": false,
+ "logVerbose": false,
+ "description": "(runbooks).vmmAnalytics.description",
+ "publishContentLink": {
+ "uri": "(runbooks).vmmAnalytics.uri",
+ "version": "(runbooks).vmmAnalytics.version"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT782 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT782
new file mode 100644
index 0000000..9a2fa10
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT782
@@ -0,0 +1,337 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/openvpn-access-server-ubuntu/azuredeploy.json",
+ "/demos/openvpn-access-server-ubuntu/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901144,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/openvpn-access-server-ubuntu/azuredeploy.json",
+ "/demos/openvpn-access-server-ubuntu/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT782",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT782",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "openvpnPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the openvpn user."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Name for the publicly accessible node. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_B1s",
+ "metadata": {
+ "description": "The size of the virtual machines used when provisioning"
+ }
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "18.04-LTS",
+ "allowedValues": [
+ "16.04.0-LTS",
+ "18.04-LTS"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values: 16.04.0-LTS, 18.04-LTS."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "OpenVPN-NIC",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "StandardSSD_LRS",
+ "publicIPAddressName": "OpenVPN-PublicIP",
+ "publicIPAddressType": "Static",
+ "vmName": "OpenVPN-VM",
+ "virtualNetworkName": "OpenVPN-VNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/OpenVPN-VNET/Subnet",
+ "networkSecurityGroupName": "OpenVPN-NSG",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "OpenVPN-PublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "name": "OpenVPN-NSG",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-05-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "OpenVPN_WebServer",
+ "properties": {
+ "priority": 1200,
+ "sourceAddressPrefix": "*",
+ "protocol": "Tcp",
+ "destinationPortRange": "943",
+ "access": "Allow",
+ "direction": "Inbound",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "OpenVPN443",
+ "properties": {
+ "priority": 1100,
+ "sourceAddressPrefix": "*",
+ "protocol": "Tcp",
+ "destinationPortRange": "443",
+ "access": "Allow",
+ "direction": "Inbound",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "OpenVPN1194",
+ "properties": {
+ "priority": 1300,
+ "sourceAddressPrefix": "*",
+ "protocol": "UDP",
+ "destinationPortRange": "1194",
+ "access": "Allow",
+ "direction": "Inbound",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "default-allow-ssh",
+ "properties": {
+ "priority": 1000,
+ "sourceAddressPrefix": "*",
+ "protocol": "Tcp",
+ "destinationPortRange": "22",
+ "access": "Allow",
+ "direction": "Inbound",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "OpenVPN-VNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "OpenVPN-NIC",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//OpenVPN-PublicIP",
+ "Microsoft.Network/virtualNetworks//OpenVPN-VNET",
+ "Microsoft.Network/networkSecurityGroups//OpenVPN-NSG"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/OpenVPN-PublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/OpenVPN-VNET/Subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/OpenVPN-NSG"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "OpenVPN-VM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//OpenVPN-NIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_B1s"
+ },
+ "osProfile": {
+ "computerName": "OpenVPN-VM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/OpenVPN-NIC"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "OpenVPN-VM/newuserscript",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//OpenVPN-VM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('install_openvpn_access_server.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash install_openvpn_access_server.sh GEN-PASSWORD"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT783 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT783
new file mode 100644
index 0000000..7186403
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT783
@@ -0,0 +1,163 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/parameterized-linked-templates/nested/paramappgateway.json"
+ ],
+ "timestamp": 1642962901184,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/parameterized-linked-templates/nested/paramappgateway.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT783",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/applicationgateways"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT783",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure region for App Gateway"
+ }
+ },
+ "appgateway_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for the App Gateway"
+ }
+ },
+ "public_ip": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource ID for Public IP"
+ }
+ },
+ "vnet_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Virtual Network for App Gateway"
+ }
+ },
+ "vnet_subnet_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Subnet for App Gateway"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Network/applicationGateways",
+ "apiVersion": "2019-12-01",
+ "name": "appgateway_name",
+ "location": "location",
+ "properties": {
+ "sku": {
+ "name": "Standard_v2",
+ "tier": "Standard_v2"
+ },
+ "gatewayIPConfigurations": [
+ {
+ "name": "appGatewayIpConfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vnet_name/vnet_subnet_name"
+ }
+ }
+ }
+ ],
+ "frontendIPConfigurations": [
+ {
+ "name": "appGwPublicFrontendIp",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "public_ip"
+ }
+ }
+ }
+ ],
+ "frontendPorts": [
+ {
+ "name": "port_80",
+ "properties": {
+ "port": 80
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "default-backend"
+ }
+ ],
+ "backendHttpSettingsCollection": [
+ {
+ "name": "http-setting",
+ "properties": {
+ "port": 80,
+ "protocol": "Http",
+ "cookieBasedAffinity": "Disabled",
+ "pickHostNameFromBackendAddress": false,
+ "requestTimeout": 20
+ }
+ }
+ ],
+ "httpListeners": [
+ {
+ "name": "http-listener",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/applicationGateways/frontendIPConfigurations/appgateway_name/appGwPublicFrontendIp"
+ },
+ "frontendPort": {
+ "id": "Microsoft.Network/applicationGateways/frontendPorts/appgateway_name/port_80"
+ },
+ "protocol": "Http",
+ "requireServerNameIndication": false
+ }
+ }
+ ],
+ "requestRoutingRules": [
+ {
+ "name": "http-rule",
+ "properties": {
+ "ruleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners/appgateway_name/http-listener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools/appgateway_name/default-backend"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection/appgateway_name/http-setting"
+ }
+ }
+ }
+ ],
+ "enableHttp2": false,
+ "autoscaleConfiguration": {
+ "minCapacity": 0,
+ "maxCapacity": 5
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT784 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT784
new file mode 100644
index 0000000..5607d27
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT784
@@ -0,0 +1,265 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/parameterized-linked-templates/nested/paramvm.json"
+ ],
+ "timestamp": 1642962901233,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/parameterized-linked-templates/nested/paramvm.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT784",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT784",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure region for VM"
+ }
+ },
+ "vm_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for VM"
+ }
+ },
+ "vm_size": {
+ "type": "string",
+ "metadata": {
+ "description": "VM Size"
+ }
+ },
+ "datadisk_size": {
+ "type": "int",
+ "metadata": {
+ "description": "Size in GB for each Data Disk"
+ }
+ },
+ "datadisk_count": {
+ "type": "int",
+ "metadata": {
+ "description": "Count of Data Disks"
+ }
+ },
+ "admin_user": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin User for VM"
+ }
+ },
+ "ssh_pub_key": {
+ "type": "string",
+ "metadata": {
+ "description": "ssh Public Key used to access VM"
+ }
+ },
+ "vnet_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Virtual Network for VM"
+ }
+ },
+ "vnet_subnet_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Subnet for VM"
+ }
+ },
+ "proximity_group_name": {
+ "type": "string",
+ "metadata": {
+ "description": "Proximity Placement Group for VM"
+ }
+ },
+ "os_image": {
+ "type": "object",
+ "metadata": {
+ "description": "Object containing VM Image definition"
+ }
+ },
+ "post_install_actions": {
+ "type": "object",
+ "metadata": {
+ "description": "Object containing post install actions for Custom Script Extension"
+ }
+ },
+ "publicip_id_or_empty": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource ID for Public IP or an empty string if not used"
+ }
+ },
+ "appgatewaybackend_id_or_empty": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource ID for App Gateway Backend Address Pool or an empty string if not used"
+ }
+ },
+ "availabilityset_id_or_empty": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource ID for Availability Set or an empty string if not used"
+ }
+ },
+ "enable_enhanced_networking": {
+ "type": "bool",
+ "metadata": {
+ "description": "Enable Enhanced Networking (Depends on VM Size)"
+ }
+ }
+ },
+ "variables": {
+ "public_ip_if_not_empty": {
+ "id": "publicip_id_or_empty"
+ },
+ "appgatewaybackend_if_not_empty": [
+ {
+ "id": "appgatewaybackend_id_or_empty"
+ }
+ ],
+ "availabilityset_if_not_empty": {
+ "id": "availabilityset_id_or_empty"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2019-07-01",
+ "name": "vm_name",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/vm_name_nic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vm_size"
+ },
+ "proximityPlacementGroup": {
+ "id": "Microsoft.Compute/proximityPlacementGroups/proximity_group_name"
+ },
+ "availabilitySet": "[if(empty(parameters('availabilityset_id_or_empty')), json('null'), variables('availabilityset_if_not_empty'))]",
+ "storageProfile": {
+ "imageReference": "os_image",
+ "osDisk": {
+ "osType": "Linux",
+ "name": "vm_name_OsDisk",
+ "createOption": "FromImage",
+ "caching": "ReadWrite",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ },
+ "copy": [
+ {
+ "name": "datadisks",
+ "count": "datadisk_count",
+ "input": {
+ "lun": "[copyIndex('datadisks')]",
+ "name": "[concat(parameters('vm_name'), '_data_', copyIndex('datadisks'))]",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ },
+ "diskSizeGB": "datadisk_size",
+ "caching": "None",
+ "createOption": "Empty"
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vm_name_nic"
+ }
+ ]
+ },
+ "osProfile": {
+ "computerName": "vm_name",
+ "adminUsername": "admin_user",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/admin_user/.ssh/authorized_keys",
+ "keyData": "ssh_pub_key"
+ }
+ ]
+ },
+ "provisionVMAgent": true
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2019-07-01",
+ "name": "vm_name/post_install_actions",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/vm_name"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": "post_install_actions"
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2019-12-01",
+ "name": "vm_name_nic",
+ "location": "location",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vnet_name/vnet_subnet_name"
+ },
+ "applicationGatewayBackendAddressPools": "[if(empty(parameters('appgatewaybackend_id_or_empty')),json('[]'),variables('appgatewaybackend_if_not_empty'))]",
+ "primary": true,
+ "privateIPAddressVersion": "IPv4",
+ "publicIPAddress": "[if(empty(parameters('publicip_id_or_empty')),json('null'),variables('public_ip_if_not_empty'))]"
+ }
+ }
+ ],
+ "enableAcceleratedNetworking": "enable_enhanced_networking",
+ "enableIPForwarding": false
+ }
+ }
+ ],
+ "outputs": {
+ "privateIp": {
+ "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', concat(parameters('vm_name'), '_nic'))).ipConfigurations[0].properties.privateIPAddress]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT785 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT785
new file mode 100644
index 0000000..a1248c1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT785
@@ -0,0 +1,1161 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/parameterized-linked-templates/azuredeploy.json",
+ "/demos/parameterized-linked-templates/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901245,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/parameterized-linked-templates/azuredeploy.json",
+ "/demos/parameterized-linked-templates/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT785",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.resources/deployments",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/proximityplacementgroups",
+ "microsoft.network/bastionhosts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT785",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ },
+ "VirtualNetworkName": {
+ "defaultValue": "examplevnet",
+ "type": "String",
+ "metadata": {
+ "description": "Name of the VNET for all Resources."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "OperatingSystemImage": {
+ "type": "string",
+ "defaultValue": "Red Hat Enterprise Linux 7 (latest, LVM)",
+ "allowedValues": [
+ "Red Hat Enterprise Linux 7 (latest, LVM)",
+ "SUSE Enterprise Linux 12 SP5 +Patching"
+ ],
+ "metadata": {
+ "description": "OS Image to use for All VMs."
+ }
+ },
+ "ProximityPlacementGroupName": {
+ "defaultValue": "proxgroup",
+ "type": "String",
+ "metadata": {
+ "description": "Name of the Proximity Placement Group to use for All Resources."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "AdminUserForVMAccess": {
+ "type": "String",
+ "metadata": {
+ "description": "Admin User for all VMs."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "sshKeyForVMAccess": {
+ "type": "String",
+ "metadata": {
+ "description": "ssh Public Key used to access all VMs."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "MidtierNetworkSecurityGroupName": {
+ "defaultValue": "midtierNSG",
+ "type": "String",
+ "metadata": {
+ "description": "Name of the Network Security Group for the Midtier Resources."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "MidtierVMNameBase": {
+ "defaultValue": "midtier",
+ "type": "String",
+ "metadata": {
+ "description": "Prefix for naming Midtier VMs."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "MidtierVMCount": {
+ "defaultValue": 1,
+ "type": "Int",
+ "allowedValues": [
+ 0,
+ 1,
+ 3
+ ],
+ "metadata": {
+ "description": "How many Midtier VMs to provision."
+ }
+ },
+ "MidtierVMSize": {
+ "defaultValue": "Standard_D2s_v3",
+ "type": "String",
+ "allowedValues": [
+ "Standard_D2s_v3",
+ "Standard_D4s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D32s_v3"
+ ],
+ "metadata": {
+ "description": "VM Size for Midtier VMs."
+ }
+ },
+ "BackendNetworkSecurityGroupName": {
+ "defaultValue": "backendNSG",
+ "type": "String",
+ "metadata": {
+ "description": "Name of the Network Security Group for the Backend Resources."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "BackendVMNameBase": {
+ "defaultValue": "backend",
+ "type": "String",
+ "metadata": {
+ "description": "Prefix for naming Backend VMs."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "BackendVMCount": {
+ "defaultValue": 2,
+ "type": "Int",
+ "minValue": 0,
+ "maxValue": 100,
+ "metadata": {
+ "description": "How many Backend VMs to provision."
+ }
+ },
+ "BackendVMTemplate": {
+ "defaultValue": "Standard_D8s_v3 2xP10 (256MB/node)",
+ "type": "String",
+ "allowedValues": [
+ "Standard_D8s_v3 2xP10 (256MB/node)",
+ "Standard_D8s_v3 1xP30 (1024MB/node)",
+ "Standard_D16s_v3 4xP10 (512MB/node)",
+ "Standard_D16s_v3 2xP30 (2048MB/node)",
+ "Standard_D32s_v3 8xP10 (1024MB/node)",
+ "Standard_D32s_v3 4xP30 (4096MB/node)",
+ "Standard_D48s_v3 12xP10 (1536MB/node)",
+ "Standard_D48s_v3 6xP30 (6144MB/node)",
+ "Standard_D64s_v3 12xP10 (1536MB/node)",
+ "Standard_D64s_v3 6xP30 (6144MB/node)"
+ ],
+ "metadata": {
+ "description": "VM Size and Storage Profile for Backend VMs."
+ }
+ },
+ "FrontendNetworkSecurityGroupName": {
+ "defaultValue": "frontendNSG",
+ "type": "String",
+ "metadata": {
+ "description": "Name of the Network Security Group for the Frontend Resources."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "AllowFrontendConnectionFromIPOrCIDRBlock": {
+ "defaultValue": "0.0.0.0/0",
+ "type": "string",
+ "metadata": {
+ "description": "Default value of 0.0.0.0/0 allows management and connections from the entire Internet"
+ }
+ },
+ "DeployAzureBastionFrontend": {
+ "defaultValue": "Yes",
+ "type": "String",
+ "allowedValues": [
+ "No",
+ "Yes"
+ ],
+ "metadata": {
+ "description": "Selection to deploy Azure Bastion Frontend"
+ }
+ },
+ "DeployAppGatewayFrontend": {
+ "defaultValue": "Yes",
+ "type": "String",
+ "allowedValues": [
+ "No",
+ "Yes"
+ ],
+ "metadata": {
+ "description": "Selection to deploy Azure Application Gateway Frontend"
+ }
+ },
+ "DeployJumpBoxFrontend": {
+ "defaultValue": "Yes",
+ "type": "String",
+ "allowedValues": [
+ "No",
+ "Yes"
+ ],
+ "metadata": {
+ "description": "Selection to deploy Jump Box (VM) Frontend"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "AvailabilitySetFaultDomain": {
+ "eastus": 3,
+ "eastus2": 3,
+ "westus": 3,
+ "centralus": 3,
+ "northcentralus": 3,
+ "southcentralus": 3,
+ "northeurope": 3,
+ "westeurope": 3,
+ "brazilsouth": 3,
+ "CentralIndia": 3,
+ "CanadaCentral": 3,
+ "westus2": 3,
+ "FranceCentral": 3
+ },
+ "maxFaultDomainsforLocation": "[if(contains(variables('AvailabilitySetFaultDomain'),parameters('location')),variables('AvailabilitySetFaultDomain')[parameters('location')],2)]",
+ "storageProfileSimple": {
+ "Standard_D2s_v3": 1,
+ "Standard_D4s_v3": 1,
+ "Standard_D8s_v3": 2,
+ "Standard_D16s_v3": 4,
+ "Standard_D32s_v3": 8
+ },
+ "storageProfileAdvanced": {
+ "Standard_D8s_v3 2xP10 (256MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D8s_v3",
+ "diskcount": 2
+ },
+ "Standard_D8s_v3 1xP30 (1024MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D8s_v3",
+ "diskcount": 1
+ },
+ "Standard_D16s_v3 4xP10 (512MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D16s_v3",
+ "diskcount": 4
+ },
+ "Standard_D16s_v3 2xP30 (2048MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D16s_v3",
+ "diskcount": 2
+ },
+ "Standard_D32s_v3 8xP10 (1024MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D32s_v3",
+ "diskcount": 8
+ },
+ "Standard_D32s_v3 4xP30 (4096MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D32s_v3",
+ "diskcount": 4
+ },
+ "Standard_D48s_v3 12xP10 (1536MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D48s_v3",
+ "diskcount": 12
+ },
+ "Standard_D48s_v3 6xP30 (6144MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D48s_v3",
+ "diskcount": 6
+ },
+ "Standard_D64s_v3 12xP10 (1536MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D64s_v3",
+ "diskcount": 12
+ },
+ "Standard_D64s_v3 6xP30 (6144MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D64s_v3",
+ "diskcount": 6
+ }
+ },
+ "ostag": "[if(equals(parameters('OperatingSystemImage'),'Red Hat Enterprise Linux 7 (latest, LVM)'),'RH7x','SL12')]",
+ "osProfile": {
+ "RH7x": {
+ "image": {
+ "publisher": "RedHat",
+ "offer": "RHEL",
+ "sku": "7-LVM",
+ "version": "latest"
+ },
+ "diskscript": "scripts/rhel_raid_azure_data.sh"
+ },
+ "SL12": {
+ "image": {
+ "publisher": "suse",
+ "offer": "sles-12-sp5-basic",
+ "sku": "gen1",
+ "version": "latest"
+ },
+ "diskscript": "scripts/sles_raid_azure_data.sh"
+ }
+ },
+ "postInstallActions": {
+ "backend": {
+ "commandToExecute": "[concat('sh ',variables('osProfile')[variables('ostag')]['diskscript'],'; sh examplepostinstall1.sh; sh examplepostinstall2.sh')]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('osProfile')[variables('ostag')]['diskscript'], parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall1.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall2.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "midtier": {
+ "commandToExecute": "[concat('sh ',variables('osProfile')[variables('ostag')]['diskscript'],'; sh examplepostinstall1.sh')]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('osProfile')[variables('ostag')]['diskscript'], parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall1.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "jump": {
+ "commandToExecute": "[concat('sh ',variables('osProfile')[variables('ostag')]['diskscript'],'; sh examplepostinstall3.sh')]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('osProfile')[variables('ostag')]['diskscript'], parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall3.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/rhel_raid_azure_data.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/sles_raid_azure_data.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-07-01",
+ "type": "Microsoft.Compute/proximityPlacementGroups",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "condition": "[greater(parameters('BackendVMCount'),1)]",
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2019-07-01",
+ "name": "GEN-UNIQUE-8-AS",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "platformFaultDomainCount": "[if(contains(variables('AvailabilitySetFaultDomain'),parameters('location')),variables('AvailabilitySetFaultDomain')[parameters('location')],2)]",
+ "platformUpdateDomainCount": 6,
+ "proximityPlacementGroup": {
+ "id": "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ }
+ }
+ },
+ {
+ "condition": "[greater(parameters('MidtierVMCount'),1)]",
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2019-07-01",
+ "name": "GEN-UNIQUE-8-AS",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "platformFaultDomainCount": "[if(contains(variables('AvailabilitySetFaultDomain'),parameters('location')),variables('AvailabilitySetFaultDomain')[parameters('location')],2)]",
+ "platformUpdateDomainCount": 6,
+ "proximityPlacementGroup": {
+ "id": "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-12-01",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-12-01",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-12-01",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "securityRules": [
+ {
+ "name": "allow_http_from_ip_or_range_forwebhttp",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "AllowFrontendConnectionFromIPorCIDRBlock",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 500,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow_ssh_from_ip_or_range_for_jumpboxssh",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "AllowFrontendConnectionFromIPorCIDRBlock",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 510,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow_https_from_ip_or_range_for_bastion",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "AllowFrontendConnectionFromIPorCIDRBlock",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 520,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow_ssh_to_vnet_for_bastion",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 530,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "allow_rdp_to_vnet_for_bastion",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 540,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "allow_https_to_azurecloud_for_bastion",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 550,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "allow_management_from_gateway_manager_for_appgateway",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "65200-65535",
+ "sourceAddressPrefix": "GatewayManager",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 560,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "allow_https_from_gateway_manager_for_appgateway",
+ "type": "Microsoft.Network/networkSecurityGroups/securityRules",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "GatewayManager",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 570,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "ParameterizedAppGateway",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/frontend-appgateway-ip",
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-8",
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/paramappgateway.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "appgateway_name": {
+ "value": "frontend-appgateway"
+ },
+ "public_ip": {
+ "value": "Microsoft.Network/publicIPAddresses/frontend-appgateway-ip"
+ },
+ "vnet_name": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "vnet_subnet_name": {
+ "value": "AppGatewaySubnet"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "ParameterizedBackendVM-Loop",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-8",
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8",
+ "Microsoft.Resources/deployments/ParameterizedAppGateway",
+ "Microsoft.Compute/availabilitySets/GEN-UNIQUE-8-AS"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "parameters": {
+ "templateUri": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('nested/paramvm.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "Backend VM Template": {
+ "value": "Standard_D8s_v3 2xP10 (256MB/node)"
+ },
+ "Backend VM Name Base": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "Backend VM Count": {
+ "value": 2
+ },
+ "Proximity PlacementGroup Name": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "Admin User for VM Access": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "ssh Key for VM Access": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "Virtual Network Name": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "storageProfileAdvanced": {
+ "value": {
+ "Standard_D8s_v3 2xP10 (256MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D8s_v3",
+ "diskcount": 2
+ },
+ "Standard_D8s_v3 1xP30 (1024MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D8s_v3",
+ "diskcount": 1
+ },
+ "Standard_D16s_v3 4xP10 (512MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D16s_v3",
+ "diskcount": 4
+ },
+ "Standard_D16s_v3 2xP30 (2048MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D16s_v3",
+ "diskcount": 2
+ },
+ "Standard_D32s_v3 8xP10 (1024MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D32s_v3",
+ "diskcount": 8
+ },
+ "Standard_D32s_v3 4xP30 (4096MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D32s_v3",
+ "diskcount": 4
+ },
+ "Standard_D48s_v3 12xP10 (1536MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D48s_v3",
+ "diskcount": 12
+ },
+ "Standard_D48s_v3 6xP30 (6144MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D48s_v3",
+ "diskcount": 6
+ },
+ "Standard_D64s_v3 12xP10 (1536MB/node)": {
+ "disksize": 128,
+ "vmsize": "Standard_D64s_v3",
+ "diskcount": 12
+ },
+ "Standard_D64s_v3 6xP30 (6144MB/node)": {
+ "disksize": 1024,
+ "vmsize": "Standard_D64s_v3",
+ "diskcount": 6
+ }
+ }
+ },
+ "osProfile": {
+ "value": {
+ "RH7x": {
+ "image": {
+ "publisher": "RedHat",
+ "offer": "RHEL",
+ "sku": "7-LVM",
+ "version": "latest"
+ },
+ "diskscript": "scripts/rhel_raid_azure_data.sh"
+ },
+ "SL12": {
+ "image": {
+ "publisher": "suse",
+ "offer": "sles-12-sp5-basic",
+ "sku": "gen1",
+ "version": "latest"
+ },
+ "diskscript": "scripts/sles_raid_azure_data.sh"
+ }
+ }
+ },
+ "ostag": {
+ "value": "[if(equals(parameters('OperatingSystemImage'),'Red Hat Enterprise Linux 7 (latest, LVM)'),'RH7x','SL12')]"
+ },
+ "postInstallActions": {
+ "value": {
+ "backend": {
+ "commandToExecute": "[concat('sh ',variables('osProfile')[variables('ostag')]['diskscript'],'; sh examplepostinstall1.sh; sh examplepostinstall2.sh')]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('osProfile')[variables('ostag')]['diskscript'], parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall1.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall2.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "midtier": {
+ "commandToExecute": "[concat('sh ',variables('osProfile')[variables('ostag')]['diskscript'],'; sh examplepostinstall1.sh')]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('osProfile')[variables('ostag')]['diskscript'], parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall1.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "jump": {
+ "commandToExecute": "[concat('sh ',variables('osProfile')[variables('ostag')]['diskscript'],'; sh examplepostinstall3.sh')]",
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('osProfile')[variables('ostag')]['diskscript'], parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/examplepostinstall3.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/rhel_raid_azure_data.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('scripts/sles_raid_azure_data.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ }
+ },
+ "availabilityset_id_or_empty": {
+ "value": "[if(greater(parameters('BackendVMCount'),1),resourceId('Microsoft.Compute/availabilitySets',concat(parameters('BackendVMNameBase'),'-AS')),'')]"
+ },
+ "appgatewaybackend_id_or_empty": {
+ "value": "[if(equals(parameters('DeployAppGatewayFrontend'),'Yes'),resourceId('Microsoft.Network/applicationGateways/backendAddressPools', 'frontend-appgateway', 'default-backend'),'')]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "templateUri": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "Backend VM Template": {
+ "type": "string"
+ },
+ "Backend VM Name Base": {
+ "type": "string"
+ },
+ "Backend VM Count": {
+ "type": "int"
+ },
+ "Proximity PlacementGroup Name": {
+ "type": "string"
+ },
+ "Admin User for VM Access": {
+ "type": "string"
+ },
+ "ssh Key for VM Access": {
+ "type": "string"
+ },
+ "Virtual Network Name": {
+ "type": "string"
+ },
+ "storageProfileAdvanced": {
+ "type": "object"
+ },
+ "osProfile": {
+ "type": "object"
+ },
+ "ostag": {
+ "type": "string"
+ },
+ "postInstallActions": {
+ "type": "object"
+ },
+ "availabilityset_id_or_empty": {
+ "type": "string"
+ },
+ "appgatewaybackend_id_or_empty": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "ParameterizedBackendVM-copyIndex()",
+ "copy": {
+ "name": "ParameterizedBackendVM-Copy",
+ "count": "Backend VM Count"
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "templateUri"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vm_name": {
+ "value": "Backend VM Name Base-copyIndex()"
+ },
+ "vm_size": {
+ "value": "storageProfileAdvanced)[parameters(Backend VM Template"
+ },
+ "datadisk_size": {
+ "value": "storageProfileAdvanced)[parameters(Backend VM Template"
+ },
+ "datadisk_count": {
+ "value": "storageProfileAdvanced)[parameters(Backend VM Template"
+ },
+ "proximity_group_name": {
+ "value": "Proximity PlacementGroup Name"
+ },
+ "admin_user": {
+ "value": "Admin User for VM Access"
+ },
+ "ssh_pub_key": {
+ "value": "ssh Key for VM Access"
+ },
+ "vnet_name": {
+ "value": "Virtual Network Name"
+ },
+ "vnet_subnet_name": {
+ "value": "backendSubnet"
+ },
+ "os_image": {
+ "value": "osProfile)[parameters(ostag"
+ },
+ "post_install_actions": {
+ "value": "postInstallActions"
+ },
+ "enable_enhanced_networking": {
+ "value": true
+ },
+ "publicip_id_or_empty": {
+ "value": ""
+ },
+ "appgatewaybackend_id_or_empty": {
+ "value": "appgatewaybackend_id_or_empty"
+ },
+ "availabilityset_id_or_empty": {
+ "value": "availabilityset_id_or_empty"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "backendIp": {
+ "type": "array",
+ "copy": {
+ "count": "Backend VM Count",
+ "input": "[reference(resourceId('Microsoft.Resources/deployments',concat('ParameterizedBackendVM-', copyIndex()))).outputs.privateIp.value]"
+ }
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "ParameterizedMidtierVM-copyIndex()",
+ "copy": {
+ "name": "ParameterizedMidtierVM-Copy",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-8",
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8",
+ "Microsoft.Compute/availabilitySets/GEN-UNIQUE-8-AS"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/paramvm.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vm_name": {
+ "value": "GEN-UNIQUE-8-copyIndex()"
+ },
+ "vm_size": {
+ "value": "Standard_D2s_v3"
+ },
+ "datadisk_size": {
+ "value": 128
+ },
+ "datadisk_count": {
+ "value": "(storageProfileSimple)[parameters(MidtierVMSize)]"
+ },
+ "proximity_group_name": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "admin_user": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "ssh_pub_key": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vnet_name": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "vnet_subnet_name": {
+ "value": "midtierSubnet"
+ },
+ "os_image": {
+ "value": "(osProfile)[variables(ostag)][image]"
+ },
+ "post_install_actions": {
+ "value": "(postInstallActions)[midtier]"
+ },
+ "enable_enhanced_networking": {
+ "value": "[not(equals(parameters('MidtierVMSize'),'Standard_D2s_v3'))]"
+ },
+ "publicip_id_or_empty": {
+ "value": ""
+ },
+ "appgatewaybackend_id_or_empty": {
+ "value": ""
+ },
+ "availabilityset_id_or_empty": {
+ "value": "[if(greater(parameters('MidtierVMCount'),1),resourceId('Microsoft.Compute/availabilitySets',concat(parameters('MidtierVMNameBase'),'-AS')),'')]"
+ }
+ }
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "ParameterizedJumpVM",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-8",
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8",
+ "Microsoft.Network/publicIPAddresses/frontend-jumpvm-ip",
+ "ParameterizedBackendVM-Loop"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/paramvm.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vm_name": {
+ "value": "frontend-jumpvm"
+ },
+ "vm_size": {
+ "value": "Standard_B2ms"
+ },
+ "datadisk_size": {
+ "value": 128
+ },
+ "datadisk_count": {
+ "value": 1
+ },
+ "proximity_group_name": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "admin_user": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "ssh_pub_key": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vnet_name": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "vnet_subnet_name": {
+ "value": "frontendSubnet"
+ },
+ "os_image": {
+ "value": "(osProfile)[variables(ostag)][image]"
+ },
+ "post_install_actions": {
+ "value": {
+ "commandToExecute": "[concat(variables('postInstallActions')['jump'].commandToExecute,' ', string(reference('ParameterizedBackendVM-Loop').outputs.backendIp.value))]",
+ "fileUris": "(postInstallActions)[jump].fileUris"
+ }
+ },
+ "enable_enhanced_networking": {
+ "value": false
+ },
+ "publicip_id_or_empty": {
+ "value": "Microsoft.Network/publicIPAddresses/frontend-jumpvm-ip"
+ },
+ "appgatewaybackend_id_or_empty": {
+ "value": ""
+ },
+ "availabilityset_id_or_empty": {
+ "value": ""
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2019-12-01",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-8",
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-8",
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.2.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.2.0.224/27"
+ }
+ },
+ {
+ "name": "AzureBastionSubnet",
+ "properties": {
+ "addressPrefix": "10.2.0.192/27",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-8"
+ }
+ }
+ },
+ {
+ "name": "frontendSubnet",
+ "properties": {
+ "addressPrefix": "10.2.0.160/27",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-8"
+ }
+ }
+ },
+ {
+ "name": "AppGatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.2.0.128/27",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-8"
+ }
+ }
+ },
+ {
+ "name": "backendSubnet",
+ "properties": {
+ "addressPrefix": "10.2.1.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-8"
+ }
+ }
+ },
+ {
+ "name": "midtierSubnet",
+ "properties": {
+ "addressPrefix": "10.2.0.0/28",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-8"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2019-12-01",
+ "name": "frontend-bastion-ip",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2019-12-01",
+ "name": "frontend-jumpvm-ip",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2019-12-01",
+ "name": "frontend-appgateway-ip",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/bastionHosts",
+ "apiVersion": "2019-12-01",
+ "name": "bastion",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-8",
+ "Microsoft.Compute/proximityPlacementGroups/GEN-UNIQUE-8"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IpConf",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/frontend-bastion-ip"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-8/AzureBastionSubnet"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT786 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT786
new file mode 100644
index 0000000..749c772
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT786
@@ -0,0 +1,2031 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/private-aks-cluster/azuredeploy.json",
+ "/demos/private-aks-cluster/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901271,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/private-aks-cluster/azuredeploy.json",
+ "/demos/private-aks-cluster/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT786",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT786",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.613.9944",
+ "templateHash": "8835335675026401816"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "aksClusterName": {
+ "type": "string",
+ "defaultValue": "[format('aks-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the AKS cluster."
+ }
+ },
+ "aksClusterDnsPrefix": {
+ "type": "string",
+ "defaultValue": "[parameters('aksClusterName')]",
+ "metadata": {
+ "description": "Specifies the DNS prefix specified when creating the managed cluster."
+ }
+ },
+ "aksClusterTags": {
+ "type": "object",
+ "defaultValue": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ },
+ "metadata": {
+ "description": "Specifies the tags of the AKS cluster."
+ }
+ },
+ "aksClusterNetworkPlugin": {
+ "type": "string",
+ "defaultValue": "azure",
+ "allowedValues": [
+ "azure",
+ "kubenet"
+ ],
+ "metadata": {
+ "description": "Specifies the network plugin used for building Kubernetes network. - azure or kubenet."
+ }
+ },
+ "aksClusterNetworkPolicy": {
+ "type": "string",
+ "defaultValue": "azure",
+ "allowedValues": [
+ "azure",
+ "calico"
+ ],
+ "metadata": {
+ "description": "Specifies the network policy used for building Kubernetes network. - calico or azure"
+ }
+ },
+ "aksClusterPodCidr": {
+ "type": "string",
+ "defaultValue": "10.244.0.0/16",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range from which to assign pod IPs when kubenet is used."
+ }
+ },
+ "aksClusterServiceCidr": {
+ "type": "string",
+ "defaultValue": "10.2.0.0/16",
+ "metadata": {
+ "description": "A CIDR notation IP range from which to assign service cluster IPs. It must not overlap with any Subnet IP ranges."
+ }
+ },
+ "aksClusterDnsServiceIP": {
+ "type": "string",
+ "defaultValue": "10.2.0.10",
+ "metadata": {
+ "description": "Specifies the IP address assigned to the Kubernetes DNS service. It must be within the Kubernetes service address range specified in serviceCidr."
+ }
+ },
+ "aksClusterDockerBridgeCidr": {
+ "type": "string",
+ "defaultValue": "172.17.0.1/16",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range assigned to the Docker bridge network. It must not overlap with any Subnet IP ranges or the Kubernetes service address range."
+ }
+ },
+ "aksClusterLoadBalancerSku": {
+ "type": "string",
+ "defaultValue": "standard",
+ "allowedValues": [
+ "basic",
+ "standard"
+ ],
+ "metadata": {
+ "description": "Specifies the sku of the load balancer used by the virtual machine scale sets used by nodepools."
+ }
+ },
+ "aksClusterSkuTier": {
+ "type": "string",
+ "defaultValue": "Paid",
+ "allowedValues": [
+ "Paid",
+ "Free"
+ ],
+ "metadata": {
+ "description": "Specifies the tier of a managed cluster SKU: Paid or Free"
+ }
+ },
+ "aksClusterKubernetesVersion": {
+ "type": "string",
+ "defaultValue": "1.21.1",
+ "metadata": {
+ "description": "Specifies the version of Kubernetes specified when creating the managed cluster."
+ }
+ },
+ "aksClusterAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the administrator username of Linux virtual machines."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "aksClusterSshPublicKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the SSH RSA public key string for the Linux nodes."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "aadEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether enabling AAD integration."
+ }
+ },
+ "aadProfileTenantId": {
+ "type": "string",
+ "defaultValue": "[subscription().tenantId]",
+ "metadata": {
+ "description": "Specifies the tenant id of the Azure Active Directory used by the AKS cluster for authentication."
+ }
+ },
+ "aadProfileAdminGroupObjectIDs": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Specifies the AAD group object IDs that will have admin role of the cluster."
+ }
+ },
+ "aksClusterEnablePrivateCluster": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether to create the cluster as a private cluster or not."
+ }
+ },
+ "aadProfileManaged": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether to enable managed AAD integration."
+ }
+ },
+ "aadProfileEnableAzureRBAC": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether to to enable Azure RBAC for Kubernetes authorization."
+ }
+ },
+ "nodePoolName": {
+ "type": "string",
+ "defaultValue": "nodepool1",
+ "metadata": {
+ "description": "Specifies the unique name of the node pool profile in the context of the subscription and resource group."
+ }
+ },
+ "nodePoolVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4s_v3",
+ "metadata": {
+ "description": "Specifies the vm size of nodes in the node pool."
+ }
+ },
+ "nodePoolOsDiskSizeGB": {
+ "type": "int",
+ "defaultValue": 100,
+ "metadata": {
+ "description": "Specifies the OS Disk Size in GB to be used to specify the disk size for every machine in this master/agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified.."
+ }
+ },
+ "nodePoolCount": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "Specifies the number of agents (VMs) to host docker containers. Allowed values must be in the range of 1 to 100 (inclusive). The default value is 1."
+ }
+ },
+ "nodePoolOsType": {
+ "type": "string",
+ "defaultValue": "Linux",
+ "allowedValues": [
+ "Linux",
+ "Windows"
+ ],
+ "metadata": {
+ "description": "Specifies the OS type for the vms in the node pool. Choose from Linux and Windows. Default to Linux."
+ }
+ },
+ "nodePoolMaxPods": {
+ "type": "int",
+ "defaultValue": 30,
+ "metadata": {
+ "description": "Specifies the maximum number of pods that can run on a node. The maximum number of pods per node in an AKS cluster is 250. The default maximum number of pods per node varies between kubenet and Azure CNI networking, and the method of cluster deployment."
+ }
+ },
+ "nodePoolMaxCount": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "Specifies the maximum number of nodes for auto-scaling for the node pool."
+ }
+ },
+ "nodePoolMinCount": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Specifies the minimum number of nodes for auto-scaling for the node pool."
+ }
+ },
+ "nodePoolEnableAutoScaling": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether to enable auto-scaling for the node pool."
+ }
+ },
+ "nodePoolScaleSetPriority": {
+ "type": "string",
+ "defaultValue": "Regular",
+ "allowedValues": [
+ "Spot",
+ "Regular"
+ ],
+ "metadata": {
+ "description": "Specifies the virtual machine scale set priority: Spot or Regular."
+ }
+ },
+ "nodePoolNodeLabels": {
+ "type": "object",
+ "defaultValue": {},
+ "metadata": {
+ "description": "Specifies the Agent pool node labels to be persisted across all nodes in agent pool."
+ }
+ },
+ "nodePoolNodeTaints": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Specifies the taints added to new nodes during node pool create and scale. For example, key=value:NoSchedule. - string"
+ }
+ },
+ "nodePoolMode": {
+ "type": "string",
+ "defaultValue": "System",
+ "allowedValues": [
+ "System",
+ "User"
+ ],
+ "metadata": {
+ "description": "Specifies the mode of an agent pool: System or User"
+ }
+ },
+ "nodePoolType": {
+ "type": "string",
+ "defaultValue": "VirtualMachineScaleSets",
+ "allowedValues": [
+ "VirtualMachineScaleSets",
+ "AvailabilitySet"
+ ],
+ "metadata": {
+ "description": "Specifies the type of a node pool: VirtualMachineScaleSets or AvailabilitySet"
+ }
+ },
+ "nodePoolAvailabilityZones": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Specifies the availability zones for nodes. Requirese the use of VirtualMachineScaleSets as node pool type."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "[format('{0}Vnet', parameters('aksClusterName'))]",
+ "metadata": {
+ "description": "Specifies the name of the virtual network."
+ }
+ },
+ "virtualNetworkAddressPrefixes": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/8",
+ "metadata": {
+ "description": "Specifies the address prefixes of the virtual network."
+ }
+ },
+ "aksSubnetName": {
+ "type": "string",
+ "defaultValue": "AksSubnet",
+ "metadata": {
+ "description": "Specifies the name of the default subnet hosting the AKS cluster."
+ }
+ },
+ "aksSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet hosting the AKS cluster."
+ }
+ },
+ "logAnalyticsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the Log Analytics Workspace."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "logAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "PerGB2018",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode",
+ "PerGB2018"
+ ],
+ "metadata": {
+ "description": "Specifies the service tier of the workspace: Free, Standalone, PerNode, Per-GB."
+ }
+ },
+ "logAnalyticsRetentionInDays": {
+ "type": "int",
+ "defaultValue": 60,
+ "metadata": {
+ "description": "Specifies the workspace data retention in days. -1 means Unlimited retention for the Unlimited Sku. 730 days is the maximum allowed for all other Skus."
+ }
+ },
+ "vmSubnetName": {
+ "type": "string",
+ "defaultValue": "VmSubnet",
+ "metadata": {
+ "description": "Specifies the name of the subnet which contains the virtual machine."
+ }
+ },
+ "vmSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/24",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet which contains the virtual machine."
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "TestVm",
+ "metadata": {
+ "description": "Specifies the name of the virtual machine."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4s_v3",
+ "metadata": {
+ "description": "Specifies the size of the virtual machine."
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "Canonical",
+ "metadata": {
+ "description": "Specifies the image publisher of the disk image used to create the virtual machine."
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "UbuntuServer",
+ "metadata": {
+ "description": "Specifies the offer of the platform image or marketplace image used to create the virtual machine."
+ }
+ },
+ "imageSku": {
+ "type": "string",
+ "defaultValue": "18.04-LTS",
+ "metadata": {
+ "description": "Specifies the Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "password",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Specifies the type of authentication when accessing the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "vmAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the administrator account of the virtual machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrKey": {
+ "type": "secureString",
+ "metadata": {
+ "description": "Specifies the SSH Key or password for the virtual machine. SSH key is recommended."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "diskStorageAccounType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS",
+ "UltraSSD_LRS"
+ ],
+ "metadata": {
+ "description": "Specifies the storage account type for OS and data disk."
+ }
+ },
+ "numDataDisks": {
+ "type": "int",
+ "defaultValue": 1,
+ "maxValue": 64,
+ "minValue": 0,
+ "metadata": {
+ "description": "Specifies the number of data disks of the virtual machine."
+ }
+ },
+ "osDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the VM."
+ }
+ },
+ "dataDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the virtual machine."
+ }
+ },
+ "dataDiskCaching": {
+ "type": "string",
+ "defaultValue": "ReadWrite",
+ "metadata": {
+ "description": "Specifies the caching requirements for the data disks."
+ }
+ },
+ "blobStorageAccountName": {
+ "type": "string",
+ "defaultValue": "[format('blob{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the globally unique name for the storage account used to store the boot diagnostics logs of the virtual machine."
+ }
+ },
+ "blobStorageAccountPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "BlobStorageAccountPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the boot diagnostics storage account."
+ }
+ },
+ "bastionSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.1.0/26",
+ "metadata": {
+ "description": "Specifies the Bastion subnet IP prefix. This prefix must be within vnet IP prefix address space."
+ }
+ },
+ "bastionName": {
+ "type": "string",
+ "defaultValue": "[format('{0}Bastion', parameters('aksClusterName'))]",
+ "metadata": {
+ "description": "Specifies the name of the Azure Bastion resource."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "vnet",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "virtualNetworkName": {
+ "value": "[format('{0}Vnet', parameters('aksClusterName'))]"
+ },
+ "virtualNetworkAddressPrefixes": {
+ "value": "10.0.0.0/8"
+ },
+ "aksSubnetName": {
+ "value": "AksSubnet"
+ },
+ "aksSubnetAddressPrefix": {
+ "value": "10.0.0.0/16"
+ },
+ "bastionSubnetAddressPrefix": {
+ "value": "10.1.1.0/26"
+ },
+ "vmSubnetName": {
+ "value": "VmSubnet"
+ },
+ "vmSubnetAddressPrefix": {
+ "value": "10.1.0.0/24"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.613.9944",
+ "templateHash": "13404250149512381608"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "bastionSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.1.0/26",
+ "metadata": {
+ "description": "Specifies the Bastion subnet IP prefix. This prefix must be within vnet IP prefix address space."
+ }
+ },
+ "vmSubnetName": {
+ "type": "string",
+ "defaultValue": "VmSubnet",
+ "metadata": {
+ "description": "Specifies the name of the subnet which contains the virtual machine."
+ }
+ },
+ "vmSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/24",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet which contains the virtual machine."
+ }
+ },
+ "aksSubnetName": {
+ "type": "string",
+ "defaultValue": "AksSubnet",
+ "metadata": {
+ "description": "Specifies the name of the default subnet hosting the AKS cluster."
+ }
+ },
+ "aksSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet hosting the AKS cluster."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the virtual network."
+ }
+ },
+ "virtualNetworkAddressPrefixes": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/8",
+ "metadata": {
+ "description": "Specifies the address prefixes of the virtual network."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "bastionSubnetName": "AzureBastionSubnet",
+ "bastionSubnetNsgName": "[format('{0}Nsg', variables('bastionSubnetName'))]",
+ "vmSubnetNsgName": "[format('{0}Nsg', parameters('vmSubnetName'))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-08-01",
+ "name": "vmSubnetNsgName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "AllowSshInbound",
+ "properties": {
+ "priority": 100,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-08-01",
+ "name": "bastionSubnetNsgName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "bastionInAllow",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "Internet",
+ "destinationPortRange": "443",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "bastionControlInAllow",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "GatewayManager",
+ "destinationPortRanges": [
+ "443",
+ "4443"
+ ],
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowLoadBalancerInBound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationPortRange": "443",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowBastionHostCommunicationInBound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationPortRanges": [
+ "8080",
+ "5701"
+ ],
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "bastionInDeny",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 900,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "bastionVnetOutAllow",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationPortRanges": [
+ "22",
+ "3389"
+ ],
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "bastionAzureOutAllow",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationPortRange": "443",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-08-01",
+ "name": "[format('{0}Vnet', parameters('aksClusterName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/8"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "AksSubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/16",
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ },
+ {
+ "name": "VmSubnet",
+ "properties": {
+ "addressPrefix": "10.1.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/vmSubnetNsgName"
+ },
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ },
+ {
+ "name": "bastionSubnetName",
+ "properties": {
+ "addressPrefix": "10.1.1.0/26",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/bastionSubnetNsgName"
+ }
+ }
+ }
+ ],
+ "enableDdosProtection": false,
+ "enableVmProtection": false
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/bastionSubnetNsgName",
+ "Microsoft.Network/networkSecurityGroups/vmSubnetNsgName"
+ ]
+ }
+ ],
+ "outputs": {
+ "virtualNetworkResourceId": {
+ "type": "string",
+ "value": "Microsoft.Network/virtualNetworks/[format('{0}Vnet', parameters('aksClusterName'))]"
+ },
+ "bastionSubnetId": {
+ "type": "string",
+ "value": "Microsoft.Network/virtualNetworks/subnets/[format('{0}Vnet', parameters('aksClusterName'))]/bastionSubnetName"
+ },
+ "aksSubnetId": {
+ "type": "string",
+ "value": "Microsoft.Network/virtualNetworks/subnets/[format('{0}Vnet', parameters('aksClusterName'))]/AksSubnet"
+ },
+ "vmSubnetId": {
+ "type": "string",
+ "value": "Microsoft.Network/virtualNetworks/subnets/[format('{0}Vnet', parameters('aksClusterName'))]/VmSubnet"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "bastion",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "bastionHostName": {
+ "value": "[format('{0}Bastion', parameters('aksClusterName'))]"
+ },
+ "bastionSubnetId": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet'), '2019-10-01').outputs.bastionSubnetId.value]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.613.9944",
+ "templateHash": "7872254577357874088"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "bastionHostName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the Azure Bastion resource."
+ }
+ },
+ "bastionSubnetId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the id of the Azure Bastion subnet resource id."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "bastionPublicIpAddressName": "[format('{0}PublicIp', parameters('bastionHostName'))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-08-01",
+ "name": "bastionPublicIpAddressName",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "type": "Microsoft.Network/bastionHosts",
+ "apiVersion": "2020-08-01",
+ "name": "bastionHostName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IpConf",
+ "properties": {
+ "subnet": {
+ "id": "bastionSubnetId"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/bastionPublicIpAddressName"
+ }
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/bastionPublicIpAddressName"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vnet"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "log-analytics.bicep",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "logAnalyticsWorkspaceName": {
+ "value": "GEN-UNIQUE"
+ },
+ "logAnalyticsSku": {
+ "value": "PerGB2018"
+ },
+ "logAnalyticsRetentionInDays": {
+ "value": 60
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.613.9944",
+ "templateHash": "1889975189936911116"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "logAnalyticsWorkspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the Log Analytics Workspace."
+ }
+ },
+ "logAnalyticsSku": {
+ "type": "string",
+ "defaultValue": "PerGB2018",
+ "metadata": {
+ "description": "Specifies the service tier of the workspace: Free, Standalone, PerNode, Per-GB."
+ },
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode",
+ "PerGB2018"
+ ]
+ },
+ "logAnalyticsRetentionInDays": {
+ "type": "int",
+ "defaultValue": 60,
+ "metadata": {
+ "description": "Specifies the workspace data retention in days. -1 means Unlimited retention for the Unlimited Sku. 730 days is the maximum allowed for all other Skus."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-10-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "PerGB2018"
+ },
+ "retentionInDays": 60
+ }
+ }
+ ],
+ "outputs": {
+ "logAnalyticsWorkspaceId": {
+ "type": "string",
+ "value": "Microsoft.OperationalInsights/workspaces/GEN-UNIQUE"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "jumpbox",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vmName": {
+ "value": "TestVm"
+ },
+ "vmAdminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrKey": {
+ "value": "GEN-PASSWORD"
+ },
+ "vmSize": {
+ "value": "Standard_D4s_v3"
+ },
+ "authenticationType": {
+ "value": "password"
+ },
+ "diskStorageAccounType": {
+ "value": "Premium_LRS"
+ },
+ "osDiskSize": {
+ "value": 50
+ },
+ "dataDiskCaching": {
+ "value": "ReadWrite"
+ },
+ "dataDiskSize": {
+ "value": 50
+ },
+ "numDataDisks": {
+ "value": 1
+ },
+ "imageOffer": {
+ "value": "UbuntuServer"
+ },
+ "imagePublisher": {
+ "value": "Canonical"
+ },
+ "imageSku": {
+ "value": "18.04-LTS"
+ },
+ "blobStorageAccountName": {
+ "value": "[format('blob{0}', uniqueString(resourceGroup().id))]"
+ },
+ "blobStorageAccountPrivateEndpointName": {
+ "value": "BlobStorageAccountPrivateEndpoint"
+ },
+ "logAnalyticsWorkspaceId": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics.bicep'), '2019-10-01').outputs.logAnalyticsWorkspaceId.value]"
+ },
+ "virtualNetworkId": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet'), '2019-10-01').outputs.virtualNetworkResourceId.value]"
+ },
+ "vmSubnetId": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet'), '2019-10-01').outputs.vmSubnetId.value]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.613.9944",
+ "templateHash": "14077010491250246894"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "virtualNetworkId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the id of the virtual network."
+ }
+ },
+ "vmSubnetId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the idof the subnet which contains the virtual machine."
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "TestVm",
+ "metadata": {
+ "description": "Specifies the name of the virtual machine."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_DS3_v2",
+ "metadata": {
+ "description": "Specifies the size of the virtual machine."
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "Canonical",
+ "metadata": {
+ "description": "Specifies the image publisher of the disk image used to create the virtual machine."
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "UbuntuServer",
+ "metadata": {
+ "description": "Specifies the offer of the platform image or marketplace image used to create the virtual machine."
+ }
+ },
+ "imageSku": {
+ "type": "string",
+ "defaultValue": "18.04-LTS",
+ "metadata": {
+ "description": "Specifies the Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "password",
+ "metadata": {
+ "description": "Specifies the type of authentication when accessing the Virtual Machine. SSH key is recommended."
+ },
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ]
+ },
+ "vmAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the administrator account of the virtual machine."
+ }
+ },
+ "vmAdminPasswordOrKey": {
+ "type": "secureString",
+ "metadata": {
+ "description": "Specifies the SSH Key or password for the virtual machine. SSH key is recommended."
+ }
+ },
+ "diskStorageAccounType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "metadata": {
+ "description": "Specifies the storage account type for OS and data disk."
+ },
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS",
+ "UltraSSD_LRS"
+ ]
+ },
+ "numDataDisks": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "Specifies the number of data disks of the virtual machine."
+ },
+ "maxValue": 64,
+ "minValue": 0
+ },
+ "osDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the VM."
+ }
+ },
+ "dataDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the virtual machine."
+ }
+ },
+ "dataDiskCaching": {
+ "type": "string",
+ "defaultValue": "ReadWrite",
+ "metadata": {
+ "description": "Specifies the caching requirements for the data disks."
+ }
+ },
+ "blobStorageAccountName": {
+ "type": "string",
+ "defaultValue": "[format('blob{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the globally unique name for the storage account used to store the boot diagnostics logs of the virtual machine."
+ }
+ },
+ "blobStorageAccountPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "BlobStorageAccountPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the boot diagnostics storage account."
+ }
+ },
+ "logAnalyticsWorkspaceId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the id of the Log Analytics Workspace."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "vmNicName": "[format('{0}Nic', parameters('vmName'))]",
+ "blobPublicDNSZoneForwarder": "[format('.blob.{0}', environment().suffixes.storage)]",
+ "blobPrivateDnsZoneName": "[format('privatelink{0}', variables('blobPublicDNSZoneForwarder'))]",
+ "blobStorageAccountPrivateEndpointGroupName": "blob",
+ "omsAgentForLinuxName": "LogAnalytics",
+ "omsDependencyAgentForLinuxName": "DependencyAgent",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "[format('/home/{0}/.ssh/authorized_keys', parameters('vmAdminUsername'))]",
+ "keyData": "GEN-PASSWORD"
+ }
+ ]
+ },
+ "provisionVMAgent": true
+ },
+ "virtualNetworkName": "[last(split(parameters('virtualNetworkId'), '/'))]",
+ "logAnalyticsWorkspaceName": "[last(split(parameters('logAnalyticsWorkspaceId'), '/'))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2021-01-01",
+ "name": "[format('blob{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-08-01",
+ "name": "vmNicName",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "vmSubnetId"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "name": "TestVm",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4s_v3"
+ },
+ "osProfile": {
+ "computerName": "TestVm",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), null(), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "copy": [
+ {
+ "name": "dataDisks",
+ "count": 36,
+ "input": {
+ "caching": "ReadWrite",
+ "diskSizeGB": 50,
+ "lun": "[range(0, parameters('numDataDisks'))[copyIndex('dataDisks')]]",
+ "name": "[format('{0}-DataDisk{1}', parameters('vmName'), range(0, parameters('numDataDisks'))[copyIndex('dataDisks')])]",
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ }
+ ],
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[format('{0}_OSDisk', parameters('vmName'))]",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "diskSizeGB": 50,
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmNicName"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('blobStorageAccountName'))).primaryEndpoints.blob]"
+ }
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/[format('blob{0}', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/networkInterfaces/vmNicName"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[format('{0}/{1}', parameters('vmName'), variables('omsAgentForLinuxName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.EnterpriseCloud.Monitoring",
+ "type": "OmsAgentForLinux",
+ "typeHandlerVersion": "1.13",
+ "settings": {
+ "workspaceId": "[reference(resourceId('Microsoft.OperationalInsights/workspaces', variables('logAnalyticsWorkspaceName')), '2020-10-01').customerId]",
+ "stopOnMultipleConnections": false
+ },
+ "protectedSettings": {
+ "workspaceKey": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces', variables('logAnalyticsWorkspaceName')), '2020-10-01').primarySharedKey]"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/TestVm"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[format('{0}/{1}', parameters('vmName'), variables('omsDependencyAgentForLinuxName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.Azure.Monitoring.DependencyAgent",
+ "type": "DependencyAgentLinux",
+ "typeHandlerVersion": "9.10",
+ "autoUpgradeMinorVersion": true
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/TestVm"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "blobPrivateDnsZoneName",
+ "location": "global"
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "[format('{0}/{1}', variables('blobPrivateDnsZoneName'), format('link_to_{0}', toLower(variables('virtualNetworkName'))))]",
+ "location": "global",
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "virtualNetworkId"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/blobPrivateDnsZoneName"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-08-01",
+ "name": "BlobStorageAccountPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "BlobStorageAccountPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.Storage/storageAccounts/[format('blob{0}', uniqueString(resourceGroup().id))]",
+ "groupIds": [
+ "blobStorageAccountPrivateEndpointGroupName"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "vmSubnetId"
+ },
+ "customDnsConfigs": [
+ {
+ "fqdn": "[format('{0}{1}', parameters('blobStorageAccountName'), variables('blobPublicDNSZoneForwarder'))]"
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/[format('blob{0}', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
+ "apiVersion": "2020-08-01",
+ "name": "[format('{0}/{1}', parameters('blobStorageAccountPrivateEndpointName'), format('{0}PrivateDnsZoneGroup', variables('blobStorageAccountPrivateEndpointGroupName')))]",
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "dnsConfig",
+ "properties": {
+ "privateDnsZoneId": "Microsoft.Network/privateDnsZones/blobPrivateDnsZoneName"
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/blobPrivateDnsZoneName",
+ "Microsoft.Network/privateEndpoints/BlobStorageAccountPrivateEndpoint"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/log-analytics.bicep",
+ "Microsoft.Resources/deployments/vnet"
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "aks",
+ "properties": {
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "mode": "Incremental",
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "aadEnabled": {
+ "value": false
+ },
+ "aadProfileAdminGroupObjectIDs": {
+ "value": []
+ },
+ "aadProfileEnableAzureRBAC": {
+ "value": false
+ },
+ "aadProfileManaged": {
+ "value": false
+ },
+ "aadProfileTenantId": {
+ "value": "[subscription().tenantId]"
+ },
+ "aksClusterAdminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "aksClusterDnsPrefix": {
+ "value": "[parameters('aksClusterName')]"
+ },
+ "aksClusterDnsServiceIP": {
+ "value": "10.2.0.10"
+ },
+ "aksClusterDockerBridgeCidr": {
+ "value": "172.17.0.1/16"
+ },
+ "aksClusterEnablePrivateCluster": {
+ "value": true
+ },
+ "aksClusterKubernetesVersion": {
+ "value": "1.21.1"
+ },
+ "aksClusterLoadBalancerSku": {
+ "value": "standard"
+ },
+ "aksClusterName": {
+ "value": "[format('aks-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "aksClusterNetworkPlugin": {
+ "value": "azure"
+ },
+ "aksClusterNetworkPolicy": {
+ "value": "azure"
+ },
+ "aksClusterPodCidr": {
+ "value": "10.244.0.0/16"
+ },
+ "aksClusterServiceCidr": {
+ "value": "10.2.0.0/16"
+ },
+ "aksClusterSkuTier": {
+ "value": "Paid"
+ },
+ "aksClusterSshPublicKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "aksClusterTags": {
+ "value": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ }
+ },
+ "aksSubnetName": {
+ "value": "AksSubnet"
+ },
+ "nodePoolAvailabilityZones": {
+ "value": []
+ },
+ "nodePoolCount": {
+ "value": 5
+ },
+ "nodePoolEnableAutoScaling": {
+ "value": true
+ },
+ "nodePoolMaxCount": {
+ "value": 5
+ },
+ "nodePoolMaxPods": {
+ "value": 30
+ },
+ "nodePoolMinCount": {
+ "value": 3
+ },
+ "nodePoolMode": {
+ "value": "System"
+ },
+ "nodePoolName": {
+ "value": "nodepool1"
+ },
+ "nodePoolNodeLabels": {
+ "value": {}
+ },
+ "nodePoolNodeTaints": {
+ "value": []
+ },
+ "nodePoolOsDiskSizeGB": {
+ "value": 100
+ },
+ "nodePoolOsType": {
+ "value": "Linux"
+ },
+ "nodePoolScaleSetPriority": {
+ "value": "Regular"
+ },
+ "nodePoolType": {
+ "value": "VirtualMachineScaleSets"
+ },
+ "nodePoolVmSize": {
+ "value": "Standard_D4s_v3"
+ },
+ "virtualNetworkId": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet'), '2019-10-01').outputs.virtualNetworkResourceId.value]"
+ },
+ "logAnalyticsWorkspaceId": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics.bicep'), '2019-10-01').outputs.logAnalyticsWorkspaceId.value]"
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.613.9944",
+ "templateHash": "5939773716927315139"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "aksClusterName": {
+ "type": "string",
+ "defaultValue": "[format('aks-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the AKS cluster."
+ }
+ },
+ "aksClusterDnsPrefix": {
+ "type": "string",
+ "defaultValue": "[format('aks-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the DNS prefix specified when creating the managed cluster."
+ }
+ },
+ "aksClusterTags": {
+ "type": "object",
+ "defaultValue": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ },
+ "metadata": {
+ "description": "Specifies the tags of the AKS cluster."
+ }
+ },
+ "aksClusterNetworkPlugin": {
+ "type": "string",
+ "defaultValue": "azure",
+ "metadata": {
+ "description": "Specifies the network plugin used for building Kubernetes network. - azure or kubenet."
+ },
+ "allowedValues": [
+ "azure",
+ "kubenet"
+ ]
+ },
+ "aksClusterNetworkPolicy": {
+ "type": "string",
+ "defaultValue": "azure",
+ "metadata": {
+ "description": "Specifies the network policy used for building Kubernetes network. - calico or azure"
+ },
+ "allowedValues": [
+ "azure",
+ "calico"
+ ]
+ },
+ "aksClusterPodCidr": {
+ "type": "string",
+ "defaultValue": "10.244.0.0/16",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range from which to assign pod IPs when kubenet is used."
+ }
+ },
+ "aksClusterServiceCidr": {
+ "type": "string",
+ "defaultValue": "10.2.0.0/16",
+ "metadata": {
+ "description": "A CIDR notation IP range from which to assign service cluster IPs. It must not overlap with any Subnet IP ranges."
+ }
+ },
+ "aksClusterDnsServiceIP": {
+ "type": "string",
+ "defaultValue": "10.2.0.10",
+ "metadata": {
+ "description": "Specifies the IP address assigned to the Kubernetes DNS service. It must be within the Kubernetes service address range specified in serviceCidr."
+ }
+ },
+ "aksClusterDockerBridgeCidr": {
+ "type": "string",
+ "defaultValue": "172.17.0.1/16",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range assigned to the Docker bridge network. It must not overlap with any Subnet IP ranges or the Kubernetes service address range."
+ }
+ },
+ "aksClusterLoadBalancerSku": {
+ "type": "string",
+ "defaultValue": "standard",
+ "metadata": {
+ "description": "Specifies the sku of the load balancer used by the virtual machine scale sets used by nodepools."
+ },
+ "allowedValues": [
+ "basic",
+ "standard"
+ ]
+ },
+ "aksClusterSkuTier": {
+ "type": "string",
+ "defaultValue": "Paid",
+ "metadata": {
+ "description": "Specifies the tier of a managed cluster SKU: Paid or Free"
+ },
+ "allowedValues": [
+ "Paid",
+ "Free"
+ ]
+ },
+ "aksClusterKubernetesVersion": {
+ "type": "string",
+ "defaultValue": "1.19.7",
+ "metadata": {
+ "description": "Specifies the version of Kubernetes specified when creating the managed cluster."
+ }
+ },
+ "aksClusterAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the administrator username of Linux virtual machines."
+ }
+ },
+ "aksClusterSshPublicKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the SSH RSA public key string for the Linux nodes."
+ }
+ },
+ "aadEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether enabling AAD integration."
+ }
+ },
+ "aadProfileTenantId": {
+ "type": "string",
+ "defaultValue": "[subscription().tenantId]",
+ "metadata": {
+ "description": "Specifies the tenant id of the Azure Active Directory used by the AKS cluster for authentication."
+ }
+ },
+ "aadProfileAdminGroupObjectIDs": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Specifies the AAD group object IDs that will have admin role of the cluster."
+ }
+ },
+ "aksClusterEnablePrivateCluster": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether to create the cluster as a private cluster or not."
+ }
+ },
+ "aadProfileManaged": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether to enable managed AAD integration."
+ }
+ },
+ "aadProfileEnableAzureRBAC": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether to to enable Azure RBAC for Kubernetes authorization."
+ }
+ },
+ "nodePoolName": {
+ "type": "string",
+ "defaultValue": "nodepool1",
+ "metadata": {
+ "description": "Specifies the unique name of the node pool profile in the context of the subscription and resource group."
+ }
+ },
+ "nodePoolVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_DS3_v2",
+ "metadata": {
+ "description": "Specifies the vm size of nodes in the node pool."
+ }
+ },
+ "nodePoolOsDiskSizeGB": {
+ "type": "int",
+ "defaultValue": 100,
+ "metadata": {
+ "description": "Specifies the OS Disk Size in GB to be used to specify the disk size for every machine in this master/agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified.."
+ }
+ },
+ "nodePoolCount": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Specifies the number of agents (VMs) to host docker containers. Allowed values must be in the range of 1 to 100 (inclusive). The default value is 1."
+ }
+ },
+ "nodePoolOsType": {
+ "type": "string",
+ "defaultValue": "Linux",
+ "metadata": {
+ "description": "Specifies the OS type for the vms in the node pool. Choose from Linux and Windows. Default to Linux."
+ },
+ "allowedValues": [
+ "Linux",
+ "Windows"
+ ]
+ },
+ "nodePoolMaxPods": {
+ "type": "int",
+ "defaultValue": 30,
+ "metadata": {
+ "description": "Specifies the maximum number of pods that can run on a node. The maximum number of pods per node in an AKS cluster is 250. The default maximum number of pods per node varies between kubenet and Azure CNI networking, and the method of cluster deployment."
+ }
+ },
+ "nodePoolMaxCount": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "Specifies the maximum number of nodes for auto-scaling for the node pool."
+ }
+ },
+ "nodePoolMinCount": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Specifies the minimum number of nodes for auto-scaling for the node pool."
+ }
+ },
+ "nodePoolEnableAutoScaling": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether to enable auto-scaling for the node pool."
+ }
+ },
+ "nodePoolScaleSetPriority": {
+ "type": "string",
+ "defaultValue": "Regular",
+ "metadata": {
+ "description": "Specifies the virtual machine scale set priority: Spot or Regular."
+ },
+ "allowedValues": [
+ "Spot",
+ "Regular"
+ ]
+ },
+ "nodePoolNodeLabels": {
+ "type": "object",
+ "defaultValue": {},
+ "metadata": {
+ "description": "Specifies the Agent pool node labels to be persisted across all nodes in agent pool."
+ }
+ },
+ "nodePoolNodeTaints": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Specifies the taints added to new nodes during node pool create and scale. For example, key=value:NoSchedule. - string"
+ }
+ },
+ "nodePoolMode": {
+ "type": "string",
+ "defaultValue": "System",
+ "metadata": {
+ "description": "Specifies the mode of an agent pool: System or User"
+ },
+ "allowedValues": [
+ "System",
+ "User"
+ ]
+ },
+ "nodePoolType": {
+ "type": "string",
+ "defaultValue": "VirtualMachineScaleSets",
+ "metadata": {
+ "description": "Specifies the type of a node pool: VirtualMachineScaleSets or AvailabilitySet"
+ },
+ "allowedValues": [
+ "VirtualMachineScaleSets",
+ "AvailabilitySet"
+ ]
+ },
+ "nodePoolAvailabilityZones": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Specifies the availability zones for nodes. Requirese the use of VirtualMachineScaleSets as node pool type."
+ }
+ },
+ "virtualNetworkId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the id of the virtual network."
+ }
+ },
+ "aksSubnetName": {
+ "type": "string",
+ "defaultValue": "AksSubnet",
+ "metadata": {
+ "description": "Specifies the name of the default subnet hosting the AKS cluster."
+ }
+ },
+ "logAnalyticsWorkspaceId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the Log Analytics Workspace."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "aadProfileConfiguration": {
+ "managed": false,
+ "enableAzureRBAC": false,
+ "adminGroupObjectIDs": [],
+ "tenantID": "[subscription().tenantId]"
+ },
+ "virtualNetworkName": "[last(split(parameters('virtualNetworkId'), '/'))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ContainerService/managedClusters",
+ "apiVersion": "2021-02-01",
+ "name": "[format('aks-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "tags": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ },
+ "sku": {
+ "name": "Basic",
+ "tier": "Paid"
+ },
+ "properties": {
+ "kubernetesVersion": "1.21.1",
+ "dnsPrefix": "[parameters('aksClusterName')]",
+ "agentPoolProfiles": [
+ {
+ "name": "[toLower(parameters('nodePoolName'))]",
+ "count": 5,
+ "vmSize": "Standard_D4s_v3",
+ "osDiskSizeGB": 100,
+ "vnetSubnetID": "Microsoft.Network/virtualNetworks/subnets/virtualNetworkName/AksSubnet",
+ "maxPods": 30,
+ "osType": "Linux",
+ "maxCount": 5,
+ "minCount": 3,
+ "scaleSetPriority": "Regular",
+ "enableAutoScaling": true,
+ "mode": "System",
+ "type": "VirtualMachineScaleSets",
+ "availabilityZones": "[if(empty(parameters('nodePoolAvailabilityZones')), null(), parameters('nodePoolAvailabilityZones'))]",
+ "nodeLabels": {},
+ "nodeTaints": []
+ }
+ ],
+ "linuxProfile": {
+ "adminUsername": "GEN-UNIQUE",
+ "ssh": {
+ "publicKeys": [
+ {
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "addonProfiles": {
+ "omsagent": {
+ "enabled": true,
+ "config": {
+ "logAnalyticsWorkspaceResourceID": "logAnalyticsWorkspaceId"
+ }
+ }
+ },
+ "enableRBAC": true,
+ "networkProfile": {
+ "networkPlugin": "azure",
+ "networkPolicy": "azure",
+ "podCidr": "10.244.0.0/16",
+ "serviceCidr": "10.2.0.0/16",
+ "dnsServiceIP": "10.2.0.10",
+ "dockerBridgeCidr": "172.17.0.1/16",
+ "loadBalancerSku": "standard"
+ },
+ "aadProfile": "[if(parameters('aadEnabled'), variables('aadProfileConfiguration'), null())]",
+ "apiServerAccessProfile": {
+ "enablePrivateCluster": true
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Resources/deployments/log-analytics.bicep",
+ "Microsoft.Resources/deployments/vnet"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT787 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT787
new file mode 100644
index 0000000..9a7691e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT787
@@ -0,0 +1,1993 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/private-aks-cluster-with-public-dns-zone/azuredeploy.json",
+ "/demos/private-aks-cluster-with-public-dns-zone/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901299,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/private-aks-cluster-with-public-dns-zone/azuredeploy.json",
+ "/demos/private-aks-cluster-with-public-dns-zone/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT787",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.network/bastionhosts",
+ "microsoft.network/privateendpoints",
+ "microsoft.network/virtualnetworks",
+ "microsoft.authorization/roleassignments",
+ "microsoft.network/privatednszones/virtualnetworklinks",
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.containerservice/managedclusters",
+ "microsoft.managedidentity/userassignedidentities",
+ "microsoft.keyvault/vaults",
+ "microsoft.network/privatednszones",
+ "microsoft.network/networkinterfaces",
+ "microsoft.insights/activitylogalerts",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts",
+ "microsoft.containerregistry/registries",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.operationsmanagement/solutions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT787",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "location": {
+ "defaultValue": "[resourceGroup().location]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the location of AKS cluster."
+ }
+ },
+ "aksClusterName": {
+ "defaultValue": "[concat('aks-', uniqueString(resourceGroup().id))]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the AKS cluster."
+ }
+ },
+ "aksClusterDnsPrefix": {
+ "defaultValue": "[parameters('aksClusterName')]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the DNS prefix specified when creating the managed cluster."
+ }
+ },
+ "aksClusterTags": {
+ "defaultValue": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ },
+ "type": "object",
+ "metadata": {
+ "description": "Specifies the tags of the AKS cluster."
+ }
+ },
+ "aksClusterNetworkPlugin": {
+ "defaultValue": "azure",
+ "type": "string",
+ "allowedValues": [
+ "azure",
+ "kubenet"
+ ],
+ "metadata": {
+ "description": "Specifies the network plugin used for building Kubernetes network. - azure or kubenet."
+ }
+ },
+ "aksClusterNetworkPolicy": {
+ "defaultValue": "azure",
+ "type": "string",
+ "allowedValues": [
+ "azure",
+ "calico"
+ ],
+ "metadata": {
+ "description": "Specifies the network policy used for building Kubernetes network. - calico or azure"
+ }
+ },
+ "aksClusterPodCidr": {
+ "defaultValue": "10.244.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range from which to assign pod IPs when kubenet is used."
+ }
+ },
+ "aksClusterServiceCidr": {
+ "defaultValue": "10.3.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "A CIDR notation IP range from which to assign service cluster IPs. It must not overlap with any Subnet IP ranges."
+ }
+ },
+ "aksClusterDnsServiceIP": {
+ "defaultValue": "10.3.0.10",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the IP address assigned to the Kubernetes DNS service. It must be within the Kubernetes service address range specified in serviceCidr."
+ }
+ },
+ "aksClusterDockerBridgeCidr": {
+ "defaultValue": "172.17.0.1/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the CIDR notation IP range assigned to the Docker bridge network. It must not overlap with any Subnet IP ranges or the Kubernetes service address range."
+ }
+ },
+ "aksClusterLoadBalancerSku": {
+ "defaultValue": "standard",
+ "type": "string",
+ "allowedValues": [
+ "basic",
+ "standard"
+ ],
+ "metadata": {
+ "description": "Specifies the sku of the load balancer used by the virtual machine scale sets used by nodepools."
+ }
+ },
+ "aksClusterOutboundType": {
+ "defaultValue": "loadBalancer",
+ "type": "string",
+ "allowedValues": [
+ "loadBalancer",
+ "userDefinedRouting"
+ ],
+ "metadata": {
+ "description": "Specifies outbound (egress) routing method. - loadBalancer or userDefinedRouting."
+ }
+ },
+ "aksClusterSkuTier": {
+ "type": "string",
+ "defaultValue": "Paid",
+ "allowedValues": [
+ "Paid",
+ "Free"
+ ],
+ "metadata": {
+ "description": "Specifies the tier of a managed cluster SKU: Paid or Free"
+ }
+ },
+ "aksClusterKubernetesVersion": {
+ "type": "string",
+ "defaultValue": "1.21.2",
+ "metadata": {
+ "description": "Specifies the version of Kubernetes specified when creating the managed cluster."
+ }
+ },
+ "aksClusterAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the administrator username of Linux virtual machines."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "aksClusterSshPublicKey": {
+ "defaultValue": null,
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the SSH RSA public key string for the Linux nodes."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "aadProfileTenantId": {
+ "defaultValue": "[subscription().tenantId]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the tenant id of the Azure Active Directory used by the AKS cluster for authentication."
+ }
+ },
+ "aadProfileAdminGroupObjectIDs": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the AAD group object IDs that will have admin role of the cluster."
+ }
+ },
+ "aksUpgradeChannel": {
+ "defaultValue": "stable",
+ "type": "string",
+ "allowedValues": [
+ "rapid",
+ "stable",
+ "patch",
+ "node-image",
+ "none"
+ ],
+ "metadata": {
+ "description": "Specifies the upgrade channel for auto upgrade. Allowed values include rapid, stable, patch, node-image, none."
+ }
+ },
+ "aksClusterEnablePrivateCluster": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to create the cluster as a private cluster or not."
+ }
+ },
+ "aksPrivateDNSZone": {
+ "defaultValue": "none",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the Private DNS Zone mode for private cluster. When the value is equal to None, a Public DNS Zone is used in place of a Private DNS Zone"
+ }
+ },
+ "aksEnablePrivateClusterPublicFQDN": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to create additional public FQDN for private cluster or not."
+ }
+ },
+ "aadProfileManaged": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to enable managed AAD integration."
+ }
+ },
+ "aadProfileEnableAzureRBAC": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to to enable Azure RBAC for Kubernetes authorization."
+ }
+ },
+ "systemNodePoolName": {
+ "defaultValue": "system",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the unique name of of the system node pool profile in the context of the subscription and resource group."
+ }
+ },
+ "systemNodePoolVmSize": {
+ "defaultValue": "Standard_D16s_v3",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the vm size of nodes in the system node pool."
+ }
+ },
+ "systemNodePoolOsDiskSizeGB": {
+ "defaultValue": 100,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the OS Disk Size in GB to be used to specify the disk size for every machine in the system agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified."
+ }
+ },
+ "systemNodePoolOsDiskType": {
+ "defaultValue": "Ephemeral",
+ "type": "string",
+ "allowedValues": [
+ "Ephemeral",
+ "Managed"
+ ],
+ "metadata": {
+ "description": "Specifies the OS disk type to be used for machines in a given agent pool. Allowed values are 'Ephemeral' and 'Managed'. If unspecified, defaults to 'Ephemeral' when the VM supports ephemeral OS and has a cache disk larger than the requested OSDiskSizeGB. Otherwise, defaults to 'Managed'. May not be changed after creation. - Managed or Ephemeral"
+ }
+ },
+ "systemNodePoolAgentCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the number of agents (VMs) to host docker containers in the system node pool. Allowed values must be in the range of 1 to 100 (inclusive). The default value is 1."
+ }
+ },
+ "systemNodePoolOsType": {
+ "defaultValue": "Linux",
+ "type": "string",
+ "allowedValues": [
+ "Linux",
+ "Windows"
+ ],
+ "metadata": {
+ "description": "Specifies the OS type for the vms in the system node pool. Choose from Linux and Windows. Default to Linux."
+ }
+ },
+ "systemNodePoolMaxPods": {
+ "defaultValue": 30,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of pods that can run on a node in the system node pool. The maximum number of pods per node in an AKS cluster is 250. The default maximum number of pods per node varies between kubenet and Azure CNI networking, and the method of cluster deployment."
+ }
+ },
+ "systemNodePoolMaxCount": {
+ "defaultValue": 5,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of nodes for auto-scaling for the system node pool."
+ }
+ },
+ "systemNodePoolMinCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the minimum number of nodes for auto-scaling for the system node pool."
+ }
+ },
+ "systemNodePoolEnableAutoScaling": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to enable auto-scaling for the system node pool."
+ }
+ },
+ "systemNodePoolScaleSetPriority": {
+ "defaultValue": "Regular",
+ "allowedValues": [
+ "Spot",
+ "Regular"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the virtual machine scale set priority in the system node pool: Spot or Regular."
+ }
+ },
+ "systemNodePoolScaleSetEvictionPolicy": {
+ "defaultValue": "Delete",
+ "allowedValues": [
+ "Delete",
+ "Deallocate"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the ScaleSetEvictionPolicy to be used to specify eviction policy for spot virtual machine scale set. Default to Delete. Allowed values are Delete or Deallocate."
+ }
+ },
+ "systemNodePoolNodeLabels": {
+ "defaultValue": {},
+ "type": "object",
+ "metadata": {
+ "description": "Specifies the Agent pool node labels to be persisted across all nodes in the system node pool."
+ }
+ },
+ "systemNodePoolNodeTaints": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the taints added to new nodes during node pool create and scale. For example, key=value:NoSchedule. - string"
+ }
+ },
+ "systemNodePoolType": {
+ "defaultValue": "VirtualMachineScaleSets",
+ "type": "string",
+ "allowedValues": [
+ "VirtualMachineScaleSets",
+ "AvailabilitySet"
+ ],
+ "metadata": {
+ "description": "Specifies the type for the system node pool: VirtualMachineScaleSets or AvailabilitySet"
+ }
+ },
+ "systemNodePoolAvailabilityZones": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the availability zones for the agent nodes in the system node pool. Requirese the use of VirtualMachineScaleSets as node pool type."
+ }
+ },
+ "userNodePoolName": {
+ "defaultValue": "user",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the unique name of of the user node pool profile in the context of the subscription and resource group."
+ }
+ },
+ "userNodePoolVmSize": {
+ "defaultValue": "Standard_D16s_v3",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the vm size of nodes in the user node pool."
+ }
+ },
+ "userNodePoolOsDiskSizeGB": {
+ "defaultValue": 100,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the OS Disk Size in GB to be used to specify the disk size for every machine in the system agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified.."
+ }
+ },
+ "userNodePoolOsDiskType": {
+ "defaultValue": "Ephemeral",
+ "type": "string",
+ "allowedValues": [
+ "Ephemeral",
+ "Managed"
+ ],
+ "metadata": {
+ "description": "Specifies the OS disk type to be used for machines in a given agent pool. Allowed values are 'Ephemeral' and 'Managed'. If unspecified, defaults to 'Ephemeral' when the VM supports ephemeral OS and has a cache disk larger than the requested OSDiskSizeGB. Otherwise, defaults to 'Managed'. May not be changed after creation. - Managed or Ephemeral"
+ }
+ },
+ "userNodePoolAgentCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the number of agents (VMs) to host docker containers in the user node pool. Allowed values must be in the range of 1 to 100 (inclusive). The default value is 1."
+ }
+ },
+ "userNodePoolOsType": {
+ "defaultValue": "Linux",
+ "type": "string",
+ "allowedValues": [
+ "Linux",
+ "Windows"
+ ],
+ "metadata": {
+ "description": "Specifies the OS type for the vms in the user node pool. Choose from Linux and Windows. Default to Linux."
+ }
+ },
+ "userNodePoolMaxPods": {
+ "defaultValue": 30,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of pods that can run on a node in the user node pool. The maximum number of pods per node in an AKS cluster is 250. The default maximum number of pods per node varies between kubenet and Azure CNI networking, and the method of cluster deployment."
+ }
+ },
+ "userNodePoolMaxCount": {
+ "defaultValue": 5,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the maximum number of nodes for auto-scaling for the user node pool."
+ }
+ },
+ "userNodePoolMinCount": {
+ "defaultValue": 3,
+ "type": "int",
+ "metadata": {
+ "description": "Specifies the minimum number of nodes for auto-scaling for the user node pool."
+ }
+ },
+ "userNodePoolEnableAutoScaling": {
+ "defaultValue": true,
+ "type": "bool",
+ "metadata": {
+ "description": "Specifies whether to enable auto-scaling for the user node pool."
+ }
+ },
+ "userNodePoolScaleSetPriority": {
+ "defaultValue": "Regular",
+ "allowedValues": [
+ "Spot",
+ "Regular"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the virtual machine scale set priority in the user node pool: Spot or Regular."
+ }
+ },
+ "userNodePoolScaleSetEvictionPolicy": {
+ "defaultValue": "Delete",
+ "allowedValues": [
+ "Delete",
+ "Deallocate"
+ ],
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the ScaleSetEvictionPolicy to be used to specify eviction policy for spot virtual machine scale set. Default to Delete. Allowed values are Delete or Deallocate."
+ }
+ },
+ "userNodePoolNodeLabels": {
+ "defaultValue": {},
+ "type": "object",
+ "metadata": {
+ "description": "Specifies the Agent pool node labels to be persisted across all nodes in the user node pool."
+ }
+ },
+ "userNodePoolNodeTaints": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the taints added to new nodes during node pool create and scale. For example, key=value:NoSchedule. - string"
+ }
+ },
+ "userNodePoolType": {
+ "defaultValue": "VirtualMachineScaleSets",
+ "type": "string",
+ "allowedValues": [
+ "VirtualMachineScaleSets",
+ "AvailabilitySet"
+ ],
+ "metadata": {
+ "description": "Specifies the type for the user node pool: VirtualMachineScaleSets or AvailabilitySet"
+ }
+ },
+ "userNodePoolAvailabilityZones": {
+ "defaultValue": [],
+ "type": "array",
+ "metadata": {
+ "description": "Specifies the availability zones for the agent nodes in the user node pool. Requirese the use of VirtualMachineScaleSets as node pool type."
+ }
+ },
+ "httpApplicationRoutingEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether the httpApplicationRouting add-on is enabled or not."
+ }
+ },
+ "aciConnectorLinuxEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether the aciConnectorLinux add-on is enabled or not."
+ }
+ },
+ "azurePolicyEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether the azurepolicy add-on is enabled or not."
+ }
+ },
+ "kubeDashboardEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether the kubeDashboard add-on is enabled or not."
+ }
+ },
+ "podIdentityProfileEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specifies whether the pod identity addon is enabled.."
+ }
+ },
+ "autoScalerProfileScanInterval": {
+ "type": "string",
+ "defaultValue": "10s",
+ "metadata": {
+ "description": "Specifies the scan interval of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownDelayAfterAdd": {
+ "type": "string",
+ "defaultValue": "10m",
+ "metadata": {
+ "description": "Specifies the scale down delay after add of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownDelayAfterDelete": {
+ "type": "string",
+ "defaultValue": "20s",
+ "metadata": {
+ "description": "Specifies the scale down delay after delete of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownDelayAfterFailure": {
+ "type": "string",
+ "defaultValue": "3m",
+ "metadata": {
+ "description": "Specifies scale down delay after failure of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownUnneededTime": {
+ "type": "string",
+ "defaultValue": "10m",
+ "metadata": {
+ "description": "Specifies the scale down unneeded time of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileScaleDownUnreadyTime": {
+ "type": "string",
+ "defaultValue": "20m",
+ "metadata": {
+ "description": "Specifies the scale down unready time of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileUtilizationThreshold": {
+ "type": "string",
+ "defaultValue": "0.5",
+ "metadata": {
+ "description": "Specifies the utilization threshold of the auto-scaler of the AKS cluster."
+ }
+ },
+ "autoScalerProfileMaxGracefulTerminationSec": {
+ "type": "string",
+ "defaultValue": "600",
+ "metadata": {
+ "description": "Specifies the max graceful termination time interval in seconds for the auto-scaler of the AKS cluster."
+ }
+ },
+ "virtualNetworkName": {
+ "defaultValue": "[concat(parameters('aksClusterName'), 'Vnet')]",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the virtual network."
+ }
+ },
+ "virtualNetworkAddressPrefixes": {
+ "defaultValue": "10.0.0.0/8",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the address prefixes of the virtual network."
+ }
+ },
+ "aksSubnetName": {
+ "defaultValue": "AksSubnet",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the subnet hosting the worker nodes of the AKS cluster."
+ }
+ },
+ "aksSubnetAddressPrefix": {
+ "defaultValue": "10.0.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet hosting the worker nodes of the AKS cluster."
+ }
+ },
+ "podSubnetName": {
+ "defaultValue": "PodSubnet",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the subnet hosting the pods of the AKS cluster."
+ }
+ },
+ "podSubnetAddressPrefix": {
+ "defaultValue": "10.1.0.0/16",
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet hosting the pods of the AKS cluster."
+ }
+ },
+ "vmSubnetName": {
+ "type": "string",
+ "defaultValue": "VmSubnet",
+ "metadata": {
+ "description": "Specifies the name of the subnet which contains the virtual machine."
+ }
+ },
+ "vmSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.2.0.0/24",
+ "metadata": {
+ "description": "Specifies the address prefix of the subnet which contains the virtual machine."
+ }
+ },
+ "bastionSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.2.1.0/24",
+ "metadata": {
+ "description": "Specifies the Bastion subnet IP prefix. This prefix must be within vnet IP prefix address space."
+ }
+ },
+ "logAnalyticsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "[concat(parameters('aksClusterName'), 'Workspace')]",
+ "metadata": {
+ "description": "Specifies the name of the Log Analytics Workspace."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "logAnalyticsSku": {
+ "type": "string",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode",
+ "PerGB2018"
+ ],
+ "defaultValue": "PerNode",
+ "metadata": {
+ "description": "Specifies the service tier of the workspace: Free, Standalone, PerNode, Per-GB."
+ }
+ },
+ "logAnalyticsRetentionInDays": {
+ "type": "int",
+ "defaultValue": 60,
+ "metadata": {
+ "description": "Specifies the workspace data retention in days. -1 means Unlimited retention for the Unlimited Sku. 730 days is the maximum allowed for all other Skus."
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "TestVm",
+ "metadata": {
+ "description": "Specifies the name of the virtual machine."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D4s_v3",
+ "metadata": {
+ "description": "Specifies the size of the virtual machine."
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "Canonical",
+ "metadata": {
+ "description": "Specifies the image publisher of the disk image used to create the virtual machine."
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "UbuntuServer",
+ "metadata": {
+ "description": "Specifies the offer of the platform image or marketplace image used to create the virtual machine."
+ }
+ },
+ "imageSku": {
+ "type": "string",
+ "defaultValue": "18.04-LTS",
+ "metadata": {
+ "description": "Specifies the Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "password",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Specifies the type of authentication when accessing the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "vmAdminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the administrator account of the virtual machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Specifies the SSH Key or password for the virtual machine. SSH key is recommended."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "diskStorageAccounType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS",
+ "UltraSSD_LRS"
+ ],
+ "metadata": {
+ "description": "Specifies the storage account type for OS and data disk."
+ }
+ },
+ "numDataDisks": {
+ "type": "int",
+ "defaultValue": 1,
+ "minValue": 0,
+ "maxValue": 64,
+ "metadata": {
+ "description": "Specifies the number of data disks of the virtual machine."
+ }
+ },
+ "osDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the VM."
+ }
+ },
+ "dataDiskSize": {
+ "type": "int",
+ "defaultValue": 50,
+ "metadata": {
+ "description": "Specifies the size in GB of the OS disk of the virtual machine."
+ }
+ },
+ "dataDiskCaching": {
+ "type": "string",
+ "defaultValue": "ReadWrite",
+ "metadata": {
+ "description": "Specifies the caching requirements for the data disks."
+ }
+ },
+ "blobStorageAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('boot', uniquestring(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the globally unique name for the storage account used to store the boot diagnostics logs of the virtual machine."
+ }
+ },
+ "blobStorageAccountPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "BlobStorageAccountPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the boot diagnostics storage account."
+ }
+ },
+ "acrPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "AcrPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the Azure Container Registry."
+ }
+ },
+ "acrName": {
+ "type": "string",
+ "defaultValue": "[concat('acr', uniqueString(resourceGroup().id))]",
+ "minLength": 5,
+ "maxLength": 50,
+ "metadata": {
+ "description": "Name of your Azure Container Registry"
+ }
+ },
+ "acrAdminUserEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Enable admin user that have push / pull permission to the registry."
+ }
+ },
+ "acrSku": {
+ "type": "string",
+ "defaultValue": "Premium",
+ "allowedValues": [
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Tier of your Azure Container Registry."
+ }
+ },
+ "bastionHostName": {
+ "type": "string",
+ "defaultValue": "[concat(parameters('aksClusterName'), 'Bastion')]",
+ "metadata": {
+ "description": "Specifies the name of the Azure Bastion resource."
+ }
+ },
+ "keyVaultPrivateEndpointName": {
+ "type": "string",
+ "defaultValue": "KeyVaultPrivateEndpoint",
+ "metadata": {
+ "description": "Specifies the name of the private link to the Key Vault."
+ }
+ },
+ "keyVaultName": {
+ "type": "string",
+ "defaultValue": "[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the Key Vault resource."
+ }
+ },
+ "keyVaultNetworkRuleSetDefaultAction": {
+ "type": "string",
+ "defaultValue": "Deny",
+ "allowedValues": [
+ "Allow",
+ "Deny"
+ ],
+ "metadata": {
+ "description": "The default action of allow or deny when no other rules match. Allowed values: Allow or Deny"
+ }
+ }
+ },
+ "variables": {
+ "contributorRoleDefinitionName": "b24988ac-6180-42a0-ab88-20f7382dd24c",
+ "acrPullRoleDefinitionName": "7f951dda-4ed3-4680-a7ca-43fe172d538d",
+ "aksClusterUserDefinedManagedIdentityName": "[concat('aks-', uniqueString(resourceGroup().id))]Identity",
+ "aksClusterUserDefinedManagedIdentityId": "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]Identity",
+ "vmSubnetNsgName": "VmSubnetNsg",
+ "vmSubnetNsgId": "Microsoft.Network/networkSecurityGroups/VmSubnetNsg",
+ "bastionSubnetNsgName": "[concat('aks-', uniqueString(resourceGroup().id))]Bastion",
+ "bastionSubnetNsgId": "Microsoft.Network/networkSecurityGroups/[concat(parameters('aksClusterName'), 'Bastion')]Nsg",
+ "virtualNetworkId": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "aksSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AksSubnet",
+ "podSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/PodSubnet",
+ "vmSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet",
+ "vmNicName": "TestVmNic",
+ "vmNicId": "Microsoft.Network/networkInterfaces/TestVmNic",
+ "blobStorageAccountId": "Microsoft.Storage/storageAccounts/[concat('boot', uniquestring(resourceGroup().id))]",
+ "blobPublicDNSZoneForwarder": "[concat('blob.', environment().suffixes.storage)]",
+ "blobPrivateDnsZoneName": "[concat('privatelink.', variables('blobPublicDNSZoneForwarder'))]",
+ "blobPrivateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('blobPrivateDnsZoneName'))]",
+ "blobStorageAccountPrivateEndpointGroupName": "blob",
+ "blobPrivateDnsZoneGroupName": "blobPrivateDnsZoneGroup",
+ "blobStorageAccountPrivateEndpointId": "Microsoft.Network/privateEndpoints/BlobStorageAccountPrivateEndpoint",
+ "vmId": "Microsoft.Compute/virtualMachines/TestVm",
+ "omsAgentForLinuxName": "LogAnalytics",
+ "omsAgentForLinuxId": "Microsoft.Compute/virtualMachines/extensions/TestVm/LogAnalytics",
+ "omsDependencyAgentForLinuxName": "DependencyAgent",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-PASSWORD"
+ }
+ ]
+ },
+ "provisionVMAgent": true
+ },
+ "bastionPublicIpAddressName": "[concat('aks-', uniqueString(resourceGroup().id))]Bastion",
+ "bastionPublicIpAddressId": "Microsoft.Network/publicIPAddresses/[concat(parameters('aksClusterName'), 'Bastion')]PublicIp",
+ "bastionSubnetName": "AzureBastionSubnet",
+ "bastionSubnetId": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AzureBastionSubnet",
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "contributorRoleId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('contributorRoleDefinitionName'))]",
+ "contributorRoleAssignmentName": "[guid(concat(resourceGroup().id, variables('aksClusterUserDefinedManagedIdentityName'), parameters('aksClusterName')))]",
+ "contributorRoleAssignmentId": "Microsoft.Authorization/roleAssignments/[guid(concat(resourceGroup().id, variables('aksClusterUserDefinedManagedIdentityName'), parameters('aksClusterName')))]",
+ "acrPullRoleId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('acrPullRoleDefinitionName'))]",
+ "acrPullRoleAssignmentName": "[guid(concat(resourceGroup().id, variables('aksClusterUserDefinedManagedIdentityName'), parameters('acrName')))]",
+ "containerInsightsSolutionName": "ContainerInsights(, parameters(logAnalyticsWorkspaceName), )",
+ "acrPublicDNSZoneForwarder": "[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "acrPrivateDnsZoneName": "privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "acrPrivateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "acrPrivateEndpointGroupName": "registry",
+ "acrPrivateDnsZoneGroupName": "registryPrivateDnsZoneGroup",
+ "acrPrivateEndpointId": "Microsoft.Network/privateEndpoints/AcrPrivateEndpoint",
+ "acrId": "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "aksClusterId": "Microsoft.ContainerService/managedClusters/[concat('aks-', uniqueString(resourceGroup().id))]",
+ "keyVaultPublicDNSZoneForwarder": "[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "keyVaultPrivateDnsZoneName": "privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "keyVaultPrivateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "keyVaultPrivateEndpointId": "Microsoft.Network/privateEndpoints/KeyVaultPrivateEndpoint",
+ "keyVaultPrivateEndpointGroupName": "vault",
+ "keyVaultPrivateDnsZoneGroupName": "vaultPrivateDnsZoneGroup",
+ "keyVaultPrivateDnsZoneGroupId": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/KeyVaultPrivateEndpoint/vaultPrivateDnsZoneGroup",
+ "keyVaultId": "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "aadPodIdentityUserDefinedManagedIdentityName": "[concat('aks-', uniqueString(resourceGroup().id))]AadPodManagedIdentity",
+ "aadPodIdentityUserDefinedManagedIdentityId": "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]AadPodManagedIdentity"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[variables('bastionPublicIpAddressName')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('bastionSubnetNsgName')]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "AllowHttpsInBound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "Internet",
+ "destinationPortRange": "443",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowGatewayManagerInBound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "GatewayManager",
+ "destinationPortRange": "443",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowLoadBalancerInBound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationPortRange": "443",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowBastionHostCommunicationInBound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationPortRanges": [
+ "8080",
+ "5701"
+ ],
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "DenyAllInBound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationPortRange": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 1000,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "AllowSshRdpOutBound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationPortRanges": [
+ "22",
+ "3389"
+ ],
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "AllowAzureCloudCommunicationOutBound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationPortRange": "443",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "AllowBastionHostCommunicationOutBound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationPortRanges": [
+ "8080",
+ "5701"
+ ],
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "AllowGetSessionInformationOutBound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "Internet",
+ "destinationPortRanges": [
+ "80",
+ "443"
+ ],
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "DenyAllOutBound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Deny",
+ "priority": 1000,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/[concat(parameters('aksClusterName'), 'Bastion')]Nsg",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "NetworkSecurityGroupEvent",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ },
+ {
+ "category": "NetworkSecurityGroupRuleCounter",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/bastionHosts",
+ "name": "[concat(parameters('aksClusterName'), 'Bastion')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/[concat(parameters('aksClusterName'), 'Bastion')]PublicIp",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "IpConf",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AzureBastionSubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[concat(parameters('aksClusterName'), 'Bastion')]PublicIp"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-06-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[concat('boot', uniquestring(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "apiVersion": "2020-04-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "TestVmNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "TestVm",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/TestVmNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D4s_v3"
+ },
+ "osProfile": {
+ "computerName": "TestVm",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "TestVm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "diskSizeGB": 50,
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ },
+ "copy": [
+ {
+ "name": "dataDisks",
+ "count": 1,
+ "input": {
+ "caching": "ReadWrite",
+ "diskSizeGB": 50,
+ "lun": "[copyIndex('dataDisks')]",
+ "name": "[concat(parameters('vmName'),'-DataDisk',copyIndex('dataDisks'))]",
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/TestVmNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('blobStorageAccountId')).primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "TestVm/LogAnalytics",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/TestVm",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "publisher": "Microsoft.EnterpriseCloud.Monitoring",
+ "type": "OmsAgentForLinux",
+ "typeHandlerVersion": "1.12",
+ "settings": {
+ "workspaceId": "[reference(variables('workspaceId'), '2020-03-01-preview').customerId]",
+ "stopOnMultipleConnections": false
+ },
+ "protectedSettings": {
+ "workspaceKey": "[listKeys(variables('workspaceId'),'2020-03-01-preview').primarySharedKey]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "TestVm/DependencyAgent",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/TestVm",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "Microsoft.Compute/virtualMachines/extensions/TestVm/LogAnalytics"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Monitoring.DependencyAgent",
+ "type": "DependencyAgentLinux",
+ "typeHandlerVersion": "9.10",
+ "autoUpgradeMinorVersion": true
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "VmSubnetNsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "AllowSshInbound",
+ "properties": {
+ "priority": 100,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "Microsoft.Insights/default",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/VmSubnetNsg",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "NetworkSecurityGroupEvent",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ },
+ {
+ "category": "NetworkSecurityGroupRuleCounter",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-05-01",
+ "name": "[concat(parameters('aksClusterName'), 'Vnet')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/[concat(parameters('aksClusterName'), 'Bastion')]Nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/8"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "AksSubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/16",
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ },
+ {
+ "name": "PodSubnet",
+ "properties": {
+ "addressPrefix": "10.1.0.0/16",
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ },
+ {
+ "name": "VmSubnet",
+ "properties": {
+ "addressPrefix": "10.2.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/VmSubnetNsg"
+ },
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ },
+ {
+ "name": "AzureBastionSubnet",
+ "properties": {
+ "addressPrefix": "10.2.1.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[concat(parameters('aksClusterName'), 'Bastion')]Nsg"
+ }
+ }
+ }
+ ],
+ "enableDdosProtection": false,
+ "enableVmProtection": false
+ }
+ },
+ {
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "name": "[variables('aksClusterUserDefinedManagedIdentityName')]",
+ "apiVersion": "2018-11-30",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "comments": "User-Defined Managed Identity used by an AAD Pod Identity. Used to access Azure Key Vault.",
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[variables('aadPodIdentityUserDefinedManagedIdentityName')]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2021-04-01-preview",
+ "name": "[guid(concat(resourceGroup().id, variables('aksClusterUserDefinedManagedIdentityName'), parameters('aksClusterName')))]",
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]Identity"
+ ],
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('contributorRoleDefinitionName'))]",
+ "principalId": "[reference(variables('aksClusterUserDefinedManagedIdentityName'), '2018-11-30', 'Full').properties.principalId]",
+ "scope": "[resourceGroup().id]",
+ "principalType": "ServicePrincipal"
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2021-04-01-preview",
+ "name": "[guid(concat(resourceGroup().id, variables('aksClusterUserDefinedManagedIdentityName'), parameters('acrName')))]",
+ "dependsOn": [
+ "Microsoft.ContainerService/managedClusters/[concat('aks-', uniqueString(resourceGroup().id))]",
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('acrPullRoleDefinitionName'))]",
+ "principalId": "[reference(variables('aksClusterId'), '2020-09-01', 'Full').properties.identityProfile.kubeletidentity.objectId]",
+ "scope": "[resourceGroup().id]",
+ "principalType": "ServicePrincipal"
+ }
+ },
+ {
+ "name": "[concat('acr', uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.ContainerRegistry/registries",
+ "apiVersion": "2019-12-01-preview",
+ "location": "[resourceGroup().location]",
+ "comments": "Container registry for storing docker images",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]"
+ ],
+ "tags": {
+ "displayName": "Container Registry",
+ "container.registry": "[concat('acr', uniqueString(resourceGroup().id))]"
+ },
+ "sku": {
+ "name": "Premium",
+ "tier": "Premium"
+ },
+ "properties": {
+ "adminUserEnabled": false
+ }
+ },
+ {
+ "type": "Microsoft.ContainerService/managedClusters",
+ "apiVersion": "2021-05-01",
+ "name": "[concat('aks-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[variables('aksClusterUserDefinedManagedIdentityId')]": {}
+ }
+ },
+ "tags": {
+ "resourceType": "AKS Cluster",
+ "createdBy": "ARM Template"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "Microsoft.Authorization/roleAssignments/[guid(concat(resourceGroup().id, variables('aksClusterUserDefinedManagedIdentityName'), parameters('aksClusterName')))]",
+ "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/KeyVaultPrivateEndpoint/vaultPrivateDnsZoneGroup"
+ ],
+ "properties": {
+ "kubernetesVersion": "1.21.2",
+ "dnsPrefix": "[parameters('aksClusterName')]",
+ "sku": {
+ "name": "Basic",
+ "tier": "Paid"
+ },
+ "agentPoolProfiles": [
+ {
+ "name": "[tolower(parameters('systemNodePoolName'))]",
+ "count": 3,
+ "vmSize": "Standard_D16s_v3",
+ "osDiskSizeGB": 100,
+ "osDiskType": "Ephemeral",
+ "vnetSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AksSubnet",
+ "podSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/PodSubnet",
+ "maxPods": 30,
+ "osType": "Linux",
+ "maxCount": 5,
+ "minCount": 3,
+ "scaleSetPriority": "Regular",
+ "scaleSetEvictionPolicy": "Delete",
+ "enableAutoScaling": true,
+ "mode": "System",
+ "type": "VirtualMachineScaleSets",
+ "availabilityZones": [],
+ "nodeLabels": {},
+ "nodeTaints": []
+ },
+ {
+ "name": "[tolower(parameters('userNodePoolName'))]",
+ "count": 3,
+ "vmSize": "Standard_D16s_v3",
+ "osDiskSizeGB": 100,
+ "osDiskType": "Ephemeral",
+ "vnetSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/AksSubnet",
+ "podSubnetID": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/PodSubnet",
+ "maxPods": 30,
+ "osType": "Linux",
+ "maxCount": 5,
+ "minCount": 3,
+ "scaleSetPriority": "Regular",
+ "scaleSetEvictionPolicy": "Delete",
+ "enableAutoScaling": true,
+ "mode": "User",
+ "type": "VirtualMachineScaleSets",
+ "availabilityZones": [],
+ "nodeLabels": {},
+ "nodeTaints": []
+ }
+ ],
+ "linuxProfile": {
+ "adminUsername": "GEN-UNIQUE",
+ "ssh": {
+ "publicKeys": [
+ {
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "addonProfiles": {
+ "httpApplicationRouting": {
+ "enabled": false
+ },
+ "omsagent": {
+ "enabled": true,
+ "config": {
+ "logAnalyticsWorkspaceResourceID": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ }
+ },
+ "aciConnectorLinux": {
+ "enabled": false
+ },
+ "azurepolicy": {
+ "enabled": true,
+ "config": {
+ "version": "v2"
+ }
+ },
+ "kubeDashboard": {
+ "enabled": false
+ }
+ },
+ "podIdentityProfile": {
+ "enabled": true
+ },
+ "enableRBAC": true,
+ "networkProfile": {
+ "networkPlugin": "azure",
+ "networkPolicy": "azure",
+ "podCidr": "10.244.0.0/16",
+ "serviceCidr": "10.3.0.0/16",
+ "dnsServiceIP": "10.3.0.10",
+ "dockerBridgeCidr": "172.17.0.1/16",
+ "outboundType": "loadBalancer",
+ "loadBalancerSku": "standard",
+ "loadBalancerProfile": "[json('null')]"
+ },
+ "aadProfile": {
+ "managed": true,
+ "enableAzureRBAC": true,
+ "adminGroupObjectIDs": [],
+ "tenantID": "[subscription().tenantId]"
+ },
+ "autoUpgradeProfile": {
+ "upgradeChannel": "stable"
+ },
+ "autoScalerProfile": {
+ "scan-interval": "10s",
+ "scale-down-delay-after-add": "10m",
+ "scale-down-delay-after-delete": "20s",
+ "scale-down-delay-after-failure": "3m",
+ "scale-down-unneeded-time": "10m",
+ "scale-down-unready-time": "20m",
+ "scale-down-utilization-threshold": "0.5",
+ "max-graceful-termination-sec": "600"
+ },
+ "apiServerAccessProfile": {
+ "enablePrivateCluster": true,
+ "privateDNSZone": "none",
+ "enablePrivateClusterPublicFQDN": true
+ }
+ }
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "PerNode"
+ },
+ "retentionInDays": 60
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "apiVersion": "2015-11-01-preview",
+ "name": "ContainerInsights(, parameters(logAnalyticsWorkspaceName), )",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "microsoft.operationalinsights/workspaces/GEN-UNIQUE"
+ ],
+ "plan": {
+ "name": "ContainerInsights(, parameters(logAnalyticsWorkspaceName), )",
+ "promotionCode": "",
+ "product": "OMSGallery/ContainerInsights",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "microsoft.operationalinsights/workspaces/GEN-UNIQUE"
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "[variables('blobPrivateDnsZoneName')]",
+ "location": "global",
+ "properties": {
+ "maxNumberOfRecordSets": 25000,
+ "maxNumberOfVirtualNetworkLinks": 1000,
+ "maxNumberOfVirtualNetworkLinksWithRegistration": 100
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "location": "global",
+ "properties": {
+ "maxNumberOfRecordSets": 25000,
+ "maxNumberOfVirtualNetworkLinks": 1000,
+ "maxNumberOfVirtualNetworkLinksWithRegistration": 100
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "location": "global",
+ "properties": {
+ "maxNumberOfRecordSets": 25000,
+ "maxNumberOfVirtualNetworkLinks": 1000,
+ "maxNumberOfVirtualNetworkLinksWithRegistration": 100
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "[concat(variables('blobPrivateDnsZoneName'), '/link_to_', toLower(parameters('virtualNetworkName')))]",
+ "location": "global",
+ "dependsOn": [
+ "[variables('blobPrivateDnsZoneId')]",
+ "[variables('virtualNetworkId')]"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ }
+ }
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "[concat(variables('acrPrivateDnsZoneName'), '/link_to_', toLower(parameters('virtualNetworkName')))]",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "[concat(variables('keyVaultPrivateDnsZoneName'), '/link_to_', toLower(parameters('virtualNetworkName')))]",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "BlobStorageAccountPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.Storage/storageAccounts/[concat('boot', uniquestring(resourceGroup().id))]"
+ ],
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "BlobStorageAccountPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.Storage/storageAccounts/[concat('boot', uniquestring(resourceGroup().id))]",
+ "groupIds": [
+ "blob"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ },
+ "resources": [
+ {
+ "type": "privateDnsZoneGroups",
+ "apiVersion": "2020-07-01",
+ "name": "blobPrivateDnsZoneGroup",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[variables('blobStorageAccountPrivateEndpointId')]",
+ "[variables('blobPrivateDnsZoneId')]",
+ "[variables('blobStorageAccountPrivateEndpointId')]"
+ ],
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "dnsConfig",
+ "properties": {
+ "privateDnsZoneId": "[variables('blobPrivateDnsZoneId')]"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "KeyVaultPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "KeyVaultPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "groupIds": [
+ "vault"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ },
+ "resources": [
+ {
+ "type": "privateDnsZoneGroups",
+ "apiVersion": "2020-07-01",
+ "name": "vaultPrivateDnsZoneGroup",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]",
+ "Microsoft.Network/privateEndpoints/KeyVaultPrivateEndpoint"
+ ],
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "dnsConfig",
+ "properties": {
+ "privateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink[if(equals(toLower(environment().name), 'azureusgovernment'), '.vaultcore.usgovcloudapi.net', '.vaultcore.azure.net')]"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "condition": false,
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "AcrPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[concat(parameters('aksClusterName'), 'Vnet')]",
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "AcrPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "groupIds": [
+ "registry"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[concat(parameters('aksClusterName'), 'Vnet')]/VmSubnet"
+ }
+ },
+ "resources": [
+ {
+ "condition": false,
+ "type": "privateDnsZoneGroups",
+ "apiVersion": "2020-07-01",
+ "name": "registryPrivateDnsZoneGroup",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.ContainerRegistry/registries/[concat('acr', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]",
+ "Microsoft.Network/privateEndpoints/AcrPrivateEndpoint"
+ ],
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "dnsConfig",
+ "properties": {
+ "privateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink.[if(equals(toLower(environment().name), 'azureusgovernment'), 'azurecr.us', 'azurecr.io')]"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "microsoft.insights/activityLogAlerts",
+ "apiVersion": "2020-10-01",
+ "name": "AllAzureAdvisorAlert",
+ "location": "Global",
+ "properties": {
+ "scopes": [
+ "[resourceGroup().id]"
+ ],
+ "condition": {
+ "allOf": [
+ {
+ "field": "category",
+ "equals": "Recommendation"
+ },
+ {
+ "field": "operationName",
+ "equals": "Microsoft.Advisor/recommendations/available/action"
+ }
+ ]
+ },
+ "enabled": true,
+ "description": "All azure advisor alerts"
+ }
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults",
+ "apiVersion": "2019-09-01",
+ "name": "[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[concat('aks-', uniqueString(resourceGroup().id))]AadPodManagedIdentity"
+ ],
+ "properties": {
+ "accessPolicies": [
+ {
+ "tenantId": "[reference(variables('aadPodIdentityUserDefinedManagedIdentityId')).tenantId]",
+ "objectId": "[reference(variables('aadPodIdentityUserDefinedManagedIdentityId')).principalId]",
+ "permissions": {
+ "secrets": [
+ "get",
+ "list"
+ ],
+ "certificates": [
+ "get"
+ ]
+ }
+ }
+ ],
+ "sku": {
+ "family": "A",
+ "name": "standard"
+ },
+ "tenantId": "[subscription().tenantId]",
+ "networkAcls": {
+ "bypass": "AzureServices",
+ "defaultAction": "Deny"
+ },
+ "enabledForDeployment": false,
+ "enabledForDiskEncryption": false,
+ "enabledForTemplateDeployment": false,
+ "enableSoftDelete": false
+ },
+ "resources": [
+ {
+ "name": "Microsoft.Insights/default",
+ "type": "providers/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "workspaceId": "Microsoft.OperationalInsights/workspaces//GEN-UNIQUE",
+ "logs": [
+ {
+ "category": "AuditEvent",
+ "enabled": true
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "privateFQDN": {
+ "type": "string",
+ "value": "[reference(parameters('aksClusterName')).privateFQDN]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT788 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT788
new file mode 100644
index 0000000..47c1ce2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT788
@@ -0,0 +1,342 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/private-endpoint-sql-from-appservice/azuredeploy.json",
+ "/demos/private-endpoint-sql-from-appservice/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901329,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/private-endpoint-sql-from-appservice/azuredeploy.json",
+ "/demos/private-endpoint-sql-from-appservice/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT788",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/privatednszones",
+ "microsoft.network/virtualnetworks",
+ "microsoft.web/sites",
+ "microsoft.sql/servers/databases",
+ "microsoft.network/privatednszones/virtualnetworklinks",
+ "microsoft.sql/servers",
+ "microsoft.network/privateendpoints",
+ "microsoft.network/privateendpoints/privatednszonegroups",
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT788",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlAdministratorLogin": {
+ "type": "string",
+ "metadata": {
+ "description": "The administrator username of the SQL logical server"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sqlAdministratorLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The administrator password of the SQL logical server."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "privateDnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "Private Dns Zone Name "
+ },
+ "value": "privatelink.database.windows.net"
+ }
+ },
+ "variables": {
+ "vnetName": "myVirtualNetwork",
+ "vnetAddressPrefix": "10.0.0.0/16",
+ "subnet1Prefix": "10.0.0.0/24",
+ "subnet1Name": "mySubnet",
+ "subnetAppServicePrefix": "10.0.1.0/24",
+ "subnetAppServiceName": "subnetAppService",
+ "sqlServerName": "[concat('sqlserver', uniqueString(resourceGroup().id))]",
+ "databaseName": "[concat(variables('sqlServerName'),'/sample-db')]",
+ "privateEndpointName": "myPrivateEndpoint",
+ "pvtendpointdnsgroupname": "myPrivateEndpoint/mydnsgroupname",
+ "websitename": "[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]",
+ "appServicePlanName": "[take(concat('appSrvPln', uniqueString(resourceGroup().id)),15)]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Sql/servers",
+ "apiVersion": "2020-11-01-preview",
+ "name": "[variables('sqlServerName')]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[variables('sqlServerName')]"
+ },
+ "kind": "v12.0",
+ "properties": {
+ "administratorLogin": "GEN-UNIQUE",
+ "administratorLoginPassword": "GEN-PASSWORD",
+ "version": "12.0",
+ "publicNetworkAccess": "Disabled"
+ }
+ },
+ {
+ "type": "Microsoft.Sql/servers/databases",
+ "apiVersion": "2020-11-01-preview",
+ "name": "[variables('databaseName')]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[variables('databaseName')]"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]"
+ ],
+ "sku": {
+ "name": "Basic",
+ "tier": "Basic",
+ "capacity": 5
+ },
+ "properties": {
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "edition": "Basic",
+ "maxSizeBytes": 104857600,
+ "requestedServiceObjectiveName": "Basic",
+ "sampleName": "AdventureWorksLT"
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-07-01",
+ "name": "myVirtualNetwork",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "mySubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "privateEndpointNetworkPolicies": "Disabled"
+ }
+ },
+ {
+ "name": "subnetAppService",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24",
+ "delegations": [
+ {
+ "name": "delegation",
+ "properties": {
+ "serviceName": "Microsoft.Web/serverfarms"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "myPrivateEndpoint",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[variables('vnetName')]",
+ "[variables('sqlServerName')]"
+ ],
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVirtualNetwork/mySubnet"
+ },
+ "privateLinkServiceConnections": [
+ {
+ "name": "myPrivateEndpoint",
+ "properties": {
+ "privateLinkServiceId": "[resourceId('Microsoft.Sql/servers',variables('sqlServerName'))]",
+ "groupIds": [
+ "sqlServer"
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "privatelink.database.windows.net",
+ "location": "global",
+ "dependsOn": [
+ "myVirtualNetwork"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "privatelink.database.windows.net/privatelink.database.windows.net-link",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.database.windows.net",
+ "Microsoft.Network/virtualNetworks/myVirtualNetwork"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/myVirtualNetwork"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
+ "apiVersion": "2020-07-01",
+ "name": "myPrivateEndpoint/mydnsgroupname",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.database.windows.net",
+ "myPrivateEndpoint"
+ ],
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "config1",
+ "properties": {
+ "privateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink.database.windows.net"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Web/serverfarms",
+ "apiVersion": "2020-12-01",
+ "name": "[take(concat('appSrvPln', uniqueString(resourceGroup().id)),15)]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "P1v2",
+ "capacity": 1
+ },
+ "tags": {
+ "displayName": "[take(concat('appSrvPln', uniqueString(resourceGroup().id)),15)]"
+ },
+ "properties": {
+ "name": "[take(concat('appSrvPln', uniqueString(resourceGroup().id)),15)]"
+ }
+ },
+ {
+ "name": "[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]",
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]"
+ },
+ "dependsOn": [
+ "Microsoft.Web/serverfarms/[take(concat('appSrvPln', uniqueString(resourceGroup().id)),15)]"
+ ],
+ "properties": {
+ "name": "[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]",
+ "serverFarmId": "Microsoft.Web/serverfarms/[take(concat('appSrvPln', uniqueString(resourceGroup().id)),15)]",
+ "siteConfig": {
+ "connectionStrings": [
+ {
+ "name": "sampledbContext",
+ "connectionString": "[concat('Server=tcp:', reference(variables('sqlServerName')).fullyQualifiedDomainName, ',1433;Initial Catalog=sample-db;Persist Security Info=False;User ID=', parameters('sqlAdministratorLogin'), ';Password=', parameters('sqlAdministratorLoginPassword'), ';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;')]",
+ "type": "SQLAzure"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "type": "config",
+ "name": "appsettings",
+ "dependsOn": [
+ "Microsoft.Web/Sites//[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]",
+ "MSDeploy"
+ ],
+ "tags": {
+ "displayName": "WebAppSettings"
+ },
+ "properties": {
+ "WEBSITE_VNET_ROUTE_ALL": "1",
+ "WEBSITE_DNS_SERVER": "168.63.129.16"
+ }
+ },
+ {
+ "name": "MSDeploy",
+ "type": "extensions",
+ "apiVersion": "2019-08-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Web/sites/[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]"
+ ],
+ "tags": {
+ "displayName": "Web Deploy for webapppvtlink"
+ },
+ "properties": {
+ "packageUri": "[uri(parameters('_artifactsLocation'), concat('artifacts/AdventureWorks.Web.zip', parameters('_artifactsLocationSasToken')))]",
+ "dbType": "None",
+ "setParameters": {
+ "IIS Web Application Name": "[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-08-01",
+ "type": "networkConfig",
+ "name": "virtualNetwork",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Web/sites/[take(concat('webapppvl', uniqueString(resourceGroup().id)),15)]",
+ "MSDeploy"
+ ],
+ "properties": {
+ "subnetResourceId": "Microsoft.Network/virtualNetworks/subnets/myVirtualNetwork/subnetAppService",
+ "swiftSupported": true
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT789 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT789
new file mode 100644
index 0000000..5a16b77
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT789
@@ -0,0 +1,3024 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/rds-deployment-full-ha/azuredeploy.json",
+ "/demos/rds-deployment-full-ha/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901400,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/rds-deployment-full-ha/azuredeploy.json",
+ "/demos/rds-deployment-full-ha/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT789",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.sql/servers/databases",
+ "microsoft.resources/deployments",
+ "microsoft.sql/servers",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT789",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "projectName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 5,
+ "metadata": {
+ "description": "Define the project name or prefix for all objects."
+ },
+ "value": "GEN-UNIQUE-5"
+ },
+ "adminUser": {
+ "type": "string",
+ "metadata": {
+ "description": "What is the username for the admin on VMs and SQL Server?"
+ },
+ "value": "GEN-UNIQUE-5"
+ },
+ "adminPasswd": {
+ "type": "securestring",
+ "metadata": {
+ "description": "What is the password for the admin on VMs and SQL Server?"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The location for resources on template. By default, the same as resource group location"
+ }
+ },
+ "timeZoneID": {
+ "type": "string",
+ "defaultValue": "UTC",
+ "metadata": {
+ "description": "TimeZone ID to be used on VMs. Get available timezones with powershell Get-TimeZone command."
+ }
+ },
+ "externalDnsZone": {
+ "type": "string",
+ "defaultValue": "contosocorp.com",
+ "metadata": {
+ "description": "External public DNS domain zone. NOT AD domain. This the external domain your certs will point to."
+ }
+ },
+ "deployHA": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "This will trigger certificate request and HA deployment. If set to false, will not create HA deployment nor request certificates."
+ }
+ },
+ "dcCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "How many Domain Controllers would you like to deploy?"
+ }
+ },
+ "rdcbCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "How many RD Connection Brokers would you like to deploy?"
+ }
+ },
+ "rdwgCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "How many RD Web Access/Gateways would you like to deploy?"
+ }
+ },
+ "rdshCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "How many RD Session Hosts would you like to deploy?"
+ }
+ },
+ "lsfsCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "How many License/File Servers would you like to deploy?"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A2_v2",
+ "allowedValues": [
+ "Standard_A2_v2",
+ "Standard_A4_v2",
+ "Standard_A8_v2",
+ "Standard_D2_v3",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D2s_v3",
+ "Standard_D2s_v3"
+ ],
+ "metadata": {
+ "description": "What is the VM size for all VMs?"
+ }
+ },
+ "vmSpot": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Create Azure Spot VMs?"
+ }
+ },
+ "vmStorageSkuType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "StandardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "metadata": {
+ "description": "What is the SKU for the storage to VM managed disks?"
+ }
+ },
+ "adDomainName": {
+ "type": "string",
+ "defaultValue": "contoso.com",
+ "metadata": {
+ "description": "What is the new forest/root Active Directory domain name?"
+ }
+ },
+ "vNetPrefix": {
+ "type": "string",
+ "defaultValue": "10.100",
+ "metadata": {
+ "description": "What is the prefix for the vnet and first subnet?"
+ }
+ },
+ "vNetAddressSpace": {
+ "type": "string",
+ "defaultValue": "[concat(parameters('vNetPrefix'),'.0.0/16')]",
+ "metadata": {
+ "description": "What is the vnet address space?"
+ }
+ },
+ "vNetSubnetAddress": {
+ "type": "string",
+ "defaultValue": "[concat(parameters('vNetPrefix'),'.0.0/24')]",
+ "metadata": {
+ "description": "What is the subnet address prefix?"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templatelink.uri]",
+ "metadata": {
+ "description": "Location of all scripts and DSC resources for RDS deployment."
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "SAS storage token to access _artifactsLocation. No need to change unless you copy or fork this template."
+ }
+ }
+ },
+ "variables": {
+ "uniqueName": "[substring(uniqueString(resourceGroup().id,deployment().name),0,5)]",
+ "dnsEntry": "remoteapps",
+ "brokerName": "broker",
+ "externalFqdn": "[concat(variables('dnsEntry'),'.',toLower(parameters('externalDnsZone')))]",
+ "brokerFqdn": "[concat(variables('brokerName'),'.',toLower(parameters('externalDnsZone')))]",
+ "vmNames": [
+ "[concat(toLower(parameters('projectName')),variables('uniqueName'),'dc')]",
+ "[concat(toLower(parameters('projectName')),variables('uniqueName'),'wg')]",
+ "[concat(toLower(parameters('projectName')),variables('uniqueName'),'cb')]",
+ "[concat(toLower(parameters('projectName')),variables('uniqueName'),'sh')]",
+ "[concat(toLower(parameters('projectName')),variables('uniqueName'),'lf')]"
+ ],
+ "vmProperties": [
+ {
+ "name": "(vmNames)[0]",
+ "count": 1,
+ "intLbBackEndPool": "",
+ "pubLbBackEndPool": "",
+ "dscFunction": "DeployRDSLab.ps1\\CreateRootDomain"
+ },
+ {
+ "name": "(vmNames)[1]",
+ "count": 1,
+ "intLbBackEndPool": "rds-webgateways-int-pool",
+ "pubLbBackEndPool": "rds-webgateways-pub-pool",
+ "dscFunction": "DeployRDSLab.ps1\\RDWebGateway"
+ },
+ {
+ "name": "(vmNames)[2]",
+ "count": 1,
+ "intLbBackEndPool": "rds-brokers-int-pool",
+ "pubLbBackEndPool": "",
+ "dscFunction": "DeployRDSLab.ps1\\RDSDeployment"
+ },
+ {
+ "name": "(vmNames)[3]",
+ "count": 1,
+ "intLbBackEndPool": "",
+ "pubLbBackEndPool": "",
+ "dscFunction": "DeployRDSLab.ps1\\RDSessionHost"
+ },
+ {
+ "name": "(vmNames)[4]",
+ "count": 1,
+ "intLbBackEndPool": "",
+ "pubLbBackEndPool": "",
+ "dscFunction": "DeployRDSLab.ps1\\RDLicenseServer"
+ }
+ ],
+ "diagStorageName": "[concat(toLower(parameters('projectName')),variables('uniqueName'),'diag')]",
+ "publicLbIpName": "[concat(toLower(parameters('projectName')),'lbpip')]",
+ "diagStorageSkuType": "Standard_LRS",
+ "vNetName": "GEN-UNIQUE-5vnet",
+ "firstDcIP": "10.100.0.99",
+ "nsgRef": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-5nsg",
+ "subNetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main",
+ "sqlServerName": "[concat(toLower(parameters('projectName')),variables('uniqueName'),'sql')]",
+ "rdsDBName": "rdsdb",
+ "dscScriptName": "deployrdslab.zip",
+ "scriptName": "deploycertha.ps1"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "kind": "StorageV2",
+ "name": "[variables('diagStorageName')]",
+ "sku": {
+ "name": "Standard_LRS",
+ "tier": "Standard"
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "GEN-UNIQUE-5nsg",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Allow_RDP",
+ "properties": {
+ "access": "Allow",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*",
+ "destinationPortRange": "3389",
+ "protocol": "*",
+ "direction": "Inbound",
+ "priority": 1000
+ }
+ },
+ {
+ "name": "Allow_HTTP",
+ "properties": {
+ "access": "Allow",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*",
+ "destinationPortRange": "80",
+ "protocol": "Tcp",
+ "direction": "Inbound",
+ "priority": 1001
+ }
+ },
+ {
+ "name": "Allow_HTTPS",
+ "properties": {
+ "access": "Allow",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*",
+ "destinationPortRange": "443",
+ "protocol": "Tcp",
+ "direction": "Inbound",
+ "priority": 1002
+ }
+ },
+ {
+ "name": "Allow_UDP_3391",
+ "properties": {
+ "access": "Allow",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*",
+ "destinationPortRange": "3391",
+ "protocol": "Udp",
+ "direction": "Inbound",
+ "priority": 1003
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "GEN-UNIQUE-5vnet",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-5nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "[concat(parameters('vNetPrefix'),'.0.0/16')]"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE-5main",
+ "properties": {
+ "addressPrefix": "[concat(parameters('vNetPrefix'),'.0.0/24')]",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-5nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/loadBalancers",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "GEN-UNIQUE-5intlb",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-5vnet"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "rds-brokers-frontend",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.100.0.4",
+ "privateIPAddressVersion": "IPv4",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main"
+ }
+ }
+ },
+ {
+ "name": "rds-webgateways-frontend",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "privateIPAddressVersion": "IPv4",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "rds-brokers-int-pool",
+ "properties": {}
+ },
+ {
+ "name": "rds-webgateways-int-pool",
+ "properties": {}
+ }
+ ],
+ "probes": [
+ {
+ "name": "rds-broker-probe",
+ "properties": {
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2,
+ "protocol": "Tcp",
+ "port": 3389
+ }
+ },
+ {
+ "name": "rds-webgateway-probe",
+ "properties": {
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2,
+ "protocol": "Tcp",
+ "port": 443
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "rds-brokers-tcp-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/GEN-UNIQUE-5intlb/rds-brokers-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5intlb/rds-brokers-int-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5intlb/rds-broker-probe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 3389,
+ "backendPort": 3389,
+ "idleTimeoutInMinutes": 4
+ }
+ },
+ {
+ "name": "rds-brokers-udp-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/GEN-UNIQUE-5intlb/rds-brokers-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5intlb/rds-brokers-int-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5intlb/rds-broker-probe"
+ },
+ "protocol": "Udp",
+ "frontendPort": 3389,
+ "backendPort": 3389,
+ "idleTimeoutInMinutes": 4
+ }
+ },
+ {
+ "name": "rds-webgateway-http-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/GEN-UNIQUE-5intlb/rds-webgateways-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5intlb/rds-webgateways-int-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5intlb/rds-webgateway-probe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "idleTimeoutInMinutes": 4
+ }
+ },
+ {
+ "name": "rds-webgateway-https-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/GEN-UNIQUE-5intlb/rds-webgateways-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5intlb/rds-webgateways-int-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5intlb/rds-webgateway-probe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 443,
+ "backendPort": 443,
+ "idleTimeoutInMinutes": 4
+ }
+ },
+ {
+ "name": "rds-webgateway-udp-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/GEN-UNIQUE-5intlb/rds-webgateways-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5intlb/rds-webgateways-int-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5intlb/rds-webgateway-probe"
+ },
+ "protocol": "Udp",
+ "frontendPort": 3391,
+ "backendPort": 3391,
+ "idleTimeoutInMinutes": 4
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "[variables('publicLbIpName')]",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "[variables('publicLbIpName')]"
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-5publb",
+ "type": "Microsoft.Network/loadBalancers",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicLbIpName'))]",
+ "[resourceId('Microsoft.Network/virtualNetworks',concat(parameters('projectName'),'vnet'))]"
+ ],
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "rds-webgateways-frontend",
+ "properties": {
+ "publicIPAddress": {
+ "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicLbIpName'))]"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "rds-webgateways-pub-pool"
+ }
+ ],
+ "probes": [
+ {
+ "name": "rds-webgateways-probe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "rds-webgateways-http-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/GEN-UNIQUE-5publb/rds-webgateways-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5publb/rds-webgateways-pub-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5publb/rds-webgateways-probe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 5
+ }
+ },
+ {
+ "name": "rds-webgateways-https-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/GEN-UNIQUE-5publb/rds-webgateways-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5publb/rds-webgateways-pub-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5publb/rds-webgateways-probe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 443,
+ "backendPort": 443,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 5
+ }
+ },
+ {
+ "name": "rds-webgateways-udp-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/GEN-UNIQUE-5publb/rds-webgateways-frontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/GEN-UNIQUE-5publb/rds-webgateways-pub-pool"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/GEN-UNIQUE-5publb/rds-webgateways-probe"
+ },
+ "protocol": "Udp",
+ "frontendPort": 3391,
+ "backendPort": 3391,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 5
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "[variables('sqlServerName')]",
+ "type": "Microsoft.Sql/servers",
+ "apiVersion": "2020-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "administratorLogin": "GEN-UNIQUE-5",
+ "administratorLoginPassword": "GEN-PASSWORD"
+ },
+ "resources": [
+ {
+ "type": "firewallRules",
+ "apiVersion": "2020-11-01-preview",
+ "dependsOn": [
+ "[resourceId('Microsoft.Sql/servers',variables('sqlServerName'))]"
+ ],
+ "location": "[resourceGroup().location]",
+ "name": "AllowAllWindowsAzureIps",
+ "properties": {
+ "startIpAddress": "0.0.0.0",
+ "endIpAddress": "0.0.0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "[concat(variables('sqlServerName'),'/',variables('rdsDBName'))]",
+ "type": "Microsoft.Sql/servers/databases",
+ "apiVersion": "2020-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Sql/servers',variables('sqlServerName'))]"
+ ],
+ "sku": {
+ "name": "S2",
+ "tier": "Standard"
+ },
+ "properties": {
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "maxSizeBytes": "1073741824"
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(variables('vmProperties')[copyIndex()].name,'Deployment')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/virtualNetworks',concat(parameters('projectName'),'vnet'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'publb'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))]",
+ "[resourceId('Microsoft.Sql/servers/databases',variables('sqlServerName'),variables('rdsDBName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "timeZoneID": {
+ "value": "UTC"
+ },
+ "loopCount": {
+ "value": "(vmProperties)[copyIndex()].count"
+ },
+ "storageDiagUrl": {
+ "value": "[reference(resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))).primaryEndpoints.blob]"
+ },
+ "vmName": {
+ "value": "(vmProperties)[copyIndex()].name"
+ },
+ "subNetRef": {
+ "value": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main"
+ },
+ "vmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "vmSpot": {
+ "value": true
+ },
+ "vmStorageSkuType": {
+ "value": "Standard_LRS"
+ },
+ "adminUser": {
+ "value": "GEN-UNIQUE-5"
+ },
+ "adminPasswd": {
+ "value": "GEN-PASSWORD"
+ },
+ "intLbName": {
+ "value": "GEN-UNIQUE-5intlb"
+ },
+ "intLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].intLbBackEndPool"
+ },
+ "intLbBrokerIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[0].properties.privateIPAddress]"
+ },
+ "intLbWebGWIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[1].properties.privateIPAddress]"
+ },
+ "pubLbName": {
+ "value": "GEN-UNIQUE-5publb"
+ },
+ "pubLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].pubLbBackEndPool"
+ },
+ "adDomainName": {
+ "value": "contoso.com"
+ },
+ "firstDcIP": {
+ "value": "10.100.0.99"
+ },
+ "dcName": {
+ "value": "(vmProperties)[0].name"
+ },
+ "MainConnectionBroker": {
+ "value": "[concat(variables('vmProperties')[2].name,'1')]"
+ },
+ "WebAccessServerName": {
+ "value": "(vmProperties)[1].name"
+ },
+ "WebAccessServerCount": {
+ "value": "(vmProperties)[1].count"
+ },
+ "SessionHostName": {
+ "value": "(vmProperties)[3].name"
+ },
+ "SessionHostCount": {
+ "value": "(vmProperties)[3].count"
+ },
+ "LicenseServerName": {
+ "value": "(vmProperties)[4].name"
+ },
+ "LicenseServerCount": {
+ "value": "(vmProperties)[4].count"
+ },
+ "externalFqdn": {
+ "value": "[variables('externalFqdn')]"
+ },
+ "brokerFqdn": {
+ "value": "[variables('brokerFqdn')]"
+ },
+ "externalDnsZone": {
+ "value": "contosocorp.com"
+ },
+ "dscFunction": {
+ "value": "(vmProperties)[copyIndex()].dscFunction"
+ },
+ "dscLocation": {
+ "value": "[deployment().properties.templatelink.uri]"
+ },
+ "dscScriptName": {
+ "value": "deployrdslab.zip"
+ },
+ "scriptName": {
+ "value": "deploycertha.ps1"
+ },
+ "deployHA": {
+ "value": false
+ },
+ "rdsDBName": {
+ "value": "rdsdb"
+ },
+ "azureSqlFqdn": {
+ "value": "[reference(resourceId('Microsoft.Sql/servers',variables('sqlServerName'))).fullyQualifiedDomainName]"
+ },
+ "webGwName": {
+ "value": "remoteapps"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "timeZoneID": {
+ "type": "string"
+ },
+ "loopCount": {
+ "type": "int"
+ },
+ "storageDiagUrl": {
+ "type": "string"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "subNetRef": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmSpot": {
+ "type": "bool"
+ },
+ "vmStorageSkuType": {
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "type": "string"
+ },
+ "adminUser": {
+ "type": "string"
+ },
+ "adminPasswd": {
+ "type": "securestring"
+ },
+ "intLbName": {
+ "type": "string"
+ },
+ "intLbBackEndPool": {
+ "type": "string"
+ },
+ "intLbBrokerIP": {
+ "type": "string"
+ },
+ "intLbWebGWIP": {
+ "type": "string"
+ },
+ "pubLbName": {
+ "type": "string"
+ },
+ "pubLbBackEndPool": {
+ "type": "string"
+ },
+ "adDomainName": {
+ "type": "string"
+ },
+ "firstDcIP": {
+ "type": "string"
+ },
+ "dcName": {
+ "type": "string"
+ },
+ "MainConnectionBroker": {
+ "type": "string"
+ },
+ "WebAccessServerName": {
+ "type": "string"
+ },
+ "WebAccessServerCount": {
+ "type": "int"
+ },
+ "SessionHostName": {
+ "type": "string"
+ },
+ "SessionHostCount": {
+ "type": "int"
+ },
+ "LicenseServerName": {
+ "type": "string"
+ },
+ "LicenseServerCount": {
+ "type": "int"
+ },
+ "externalFqdn": {
+ "type": "string"
+ },
+ "brokerFqdn": {
+ "type": "string"
+ },
+ "externalDnsZone": {
+ "type": "string"
+ },
+ "dscFunction": {
+ "type": "string"
+ },
+ "dscLocation": {
+ "type": "string"
+ },
+ "dscScriptName": {
+ "type": "string"
+ },
+ "scriptName": {
+ "type": "string"
+ },
+ "deployHA": {
+ "type": "bool"
+ },
+ "rdsDBName": {
+ "type": "string"
+ },
+ "azureSQLFqdn": {
+ "type": "string"
+ },
+ "webGwName": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "scriptPath": "[uri(parameters('dscLocation'),concat('scripts/',parameters('scriptName'),parameters('_artifactsLocationSasToken')))]",
+ "intlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ }
+ ],
+ "pubIntlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ },
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/pubLbName/pubLbBackEndPool"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-07-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'pip')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "copy": {
+ "name": "vmNamepipcopy",
+ "count": "loopCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "[concat(parameters('vmName'),'pip',copyIndex(1))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'nic1')]",
+ "copy": {
+ "name": "vmNameniccopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "subNetRef"
+ },
+ "privateIPAllocationMethod": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),'static','dynamic'),'dynamic')]",
+ "privateIPAddress": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),parameters('firstDcIP'),json('null')),json('null'))]",
+ "publicIPAddress": {
+ "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ },
+ "loadBalancerBackendAddressPools": "[if(not(empty(parameters('intLbBackEndPool'))),if(not(empty(parameters('pubLbBackEndPool'))),variables('pubIntlbPool'),variables('intlbPool')),json('null'))]"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1))]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmNamevmcopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ ],
+ "properties": {
+ "licenseType": "Windows_Server",
+ "billingProfile": {
+ "maxPrice": "[if(equals(parameters('vmSpot'),bool('true')),'-1',json('null'))]"
+ },
+ "priority": "[if(equals(parameters('vmSpot'),bool('true')),'Spot',json('null'))]",
+ "evictionPolicy": "[if(equals(parameters('vmSpot'),bool('true')),'Deallocate',json('null'))]",
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "storageDiagUrl"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ }
+ ]
+ },
+ "osProfile": {
+ "adminUsername": "GEN-UNIQUE-5",
+ "adminPassword": "GEN-PASSWORD",
+ "computerName": "[concat(parameters('vmName'),copyIndex(1))]"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Standard_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/dscext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[not(empty(parameters('dscFunction')))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.11",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('dscLocation'),concat('dsc/',parameters('dscScriptName'),parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "dscFunction",
+ "Properties": {
+ "AdminCreds": {
+ "UserName": "GEN-UNIQUE-5",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ },
+ "RDSParameters": [
+ {
+ "timeZoneID": "UTC",
+ "DomainName": "contoso.com",
+ "DNSServer": "firstDcIP",
+ "MainConnectionBroker": "MainConnectionBroker",
+ "WebAccessServer": "WebAccessServerName1",
+ "SessionHost": "SessionHostName1",
+ "LicenseServer": "LicenseServerName1",
+ "externalFqdn": "externalFqdn",
+ "externalDnsDomain": "contosocorp.com",
+ "IntBrokerLBIP": "intLbBrokerIP",
+ "IntWebGWLBIP": "intLbWebGWIP",
+ "WebGWDNS": "webGwName"
+ }
+ ]
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "GEN-PASSWORD"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/pwshext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[and(contains(parameters('vmName'),'cb'),parameters('deployHA'))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]",
+ "[resourceId('Microsoft.Compute/virtualMachines/extensions',concat(parameters('vmName'),copyIndex(1)),'dscext')]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.10",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptPath"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "powershell -ExecutionPolicy Bypass -File ./scriptName -AdminUser GEN-UNIQUE-5 -Passwd GEN-PASSWORD -MainConnectionBroker MainConnectionBroker -BrokerFqdn brokerFqdn -WebGatewayFqdn externalFqdn -AzureSQLFQDN azureSqlFqdn -AzureSQLDBName rdsDBName -WebAccessServerName WebAccessServerName -WebAccessServerCount WebAccessServerCount -SessionHostName SessionHostName -SessionHostCount SessionHostCount -LicenseServerName LicenseServerName -LicenseServerCount LicenseServerCount"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(variables('vmProperties')[copyIndex()].name,'Deployment')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/virtualNetworks',concat(parameters('projectName'),'vnet'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'publb'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))]",
+ "[resourceId('Microsoft.Sql/servers/databases',variables('sqlServerName'),variables('rdsDBName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "timeZoneID": {
+ "value": "UTC"
+ },
+ "loopCount": {
+ "value": "(vmProperties)[copyIndex()].count"
+ },
+ "storageDiagUrl": {
+ "value": "[reference(resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))).primaryEndpoints.blob]"
+ },
+ "vmName": {
+ "value": "(vmProperties)[copyIndex()].name"
+ },
+ "subNetRef": {
+ "value": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main"
+ },
+ "vmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "vmSpot": {
+ "value": true
+ },
+ "vmStorageSkuType": {
+ "value": "Standard_LRS"
+ },
+ "adminUser": {
+ "value": "GEN-UNIQUE-5"
+ },
+ "adminPasswd": {
+ "value": "GEN-PASSWORD"
+ },
+ "intLbName": {
+ "value": "GEN-UNIQUE-5intlb"
+ },
+ "intLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].intLbBackEndPool"
+ },
+ "intLbBrokerIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[0].properties.privateIPAddress]"
+ },
+ "intLbWebGWIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[1].properties.privateIPAddress]"
+ },
+ "pubLbName": {
+ "value": "GEN-UNIQUE-5publb"
+ },
+ "pubLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].pubLbBackEndPool"
+ },
+ "adDomainName": {
+ "value": "contoso.com"
+ },
+ "firstDcIP": {
+ "value": "10.100.0.99"
+ },
+ "dcName": {
+ "value": "(vmProperties)[0].name"
+ },
+ "MainConnectionBroker": {
+ "value": "[concat(variables('vmProperties')[2].name,'1')]"
+ },
+ "WebAccessServerName": {
+ "value": "(vmProperties)[1].name"
+ },
+ "WebAccessServerCount": {
+ "value": "(vmProperties)[1].count"
+ },
+ "SessionHostName": {
+ "value": "(vmProperties)[3].name"
+ },
+ "SessionHostCount": {
+ "value": "(vmProperties)[3].count"
+ },
+ "LicenseServerName": {
+ "value": "(vmProperties)[4].name"
+ },
+ "LicenseServerCount": {
+ "value": "(vmProperties)[4].count"
+ },
+ "externalFqdn": {
+ "value": "[variables('externalFqdn')]"
+ },
+ "brokerFqdn": {
+ "value": "[variables('brokerFqdn')]"
+ },
+ "externalDnsZone": {
+ "value": "contosocorp.com"
+ },
+ "dscFunction": {
+ "value": "(vmProperties)[copyIndex()].dscFunction"
+ },
+ "dscLocation": {
+ "value": "[deployment().properties.templatelink.uri]"
+ },
+ "dscScriptName": {
+ "value": "deployrdslab.zip"
+ },
+ "scriptName": {
+ "value": "deploycertha.ps1"
+ },
+ "deployHA": {
+ "value": false
+ },
+ "rdsDBName": {
+ "value": "rdsdb"
+ },
+ "azureSqlFqdn": {
+ "value": "[reference(resourceId('Microsoft.Sql/servers',variables('sqlServerName'))).fullyQualifiedDomainName]"
+ },
+ "webGwName": {
+ "value": "remoteapps"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "timeZoneID": {
+ "type": "string"
+ },
+ "loopCount": {
+ "type": "int"
+ },
+ "storageDiagUrl": {
+ "type": "string"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "subNetRef": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmSpot": {
+ "type": "bool"
+ },
+ "vmStorageSkuType": {
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "type": "string"
+ },
+ "adminUser": {
+ "type": "string"
+ },
+ "adminPasswd": {
+ "type": "securestring"
+ },
+ "intLbName": {
+ "type": "string"
+ },
+ "intLbBackEndPool": {
+ "type": "string"
+ },
+ "intLbBrokerIP": {
+ "type": "string"
+ },
+ "intLbWebGWIP": {
+ "type": "string"
+ },
+ "pubLbName": {
+ "type": "string"
+ },
+ "pubLbBackEndPool": {
+ "type": "string"
+ },
+ "adDomainName": {
+ "type": "string"
+ },
+ "firstDcIP": {
+ "type": "string"
+ },
+ "dcName": {
+ "type": "string"
+ },
+ "MainConnectionBroker": {
+ "type": "string"
+ },
+ "WebAccessServerName": {
+ "type": "string"
+ },
+ "WebAccessServerCount": {
+ "type": "int"
+ },
+ "SessionHostName": {
+ "type": "string"
+ },
+ "SessionHostCount": {
+ "type": "int"
+ },
+ "LicenseServerName": {
+ "type": "string"
+ },
+ "LicenseServerCount": {
+ "type": "int"
+ },
+ "externalFqdn": {
+ "type": "string"
+ },
+ "brokerFqdn": {
+ "type": "string"
+ },
+ "externalDnsZone": {
+ "type": "string"
+ },
+ "dscFunction": {
+ "type": "string"
+ },
+ "dscLocation": {
+ "type": "string"
+ },
+ "dscScriptName": {
+ "type": "string"
+ },
+ "scriptName": {
+ "type": "string"
+ },
+ "deployHA": {
+ "type": "bool"
+ },
+ "rdsDBName": {
+ "type": "string"
+ },
+ "azureSQLFqdn": {
+ "type": "string"
+ },
+ "webGwName": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "scriptPath": "[uri(parameters('dscLocation'),concat('scripts/',parameters('scriptName'),parameters('_artifactsLocationSasToken')))]",
+ "intlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ }
+ ],
+ "pubIntlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ },
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/pubLbName/pubLbBackEndPool"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-07-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'pip')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "copy": {
+ "name": "vmNamepipcopy",
+ "count": "loopCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "[concat(parameters('vmName'),'pip',copyIndex(1))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'nic1')]",
+ "copy": {
+ "name": "vmNameniccopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "subNetRef"
+ },
+ "privateIPAllocationMethod": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),'static','dynamic'),'dynamic')]",
+ "privateIPAddress": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),parameters('firstDcIP'),json('null')),json('null'))]",
+ "publicIPAddress": {
+ "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ },
+ "loadBalancerBackendAddressPools": "[if(not(empty(parameters('intLbBackEndPool'))),if(not(empty(parameters('pubLbBackEndPool'))),variables('pubIntlbPool'),variables('intlbPool')),json('null'))]"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1))]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmNamevmcopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ ],
+ "properties": {
+ "licenseType": "Windows_Server",
+ "billingProfile": {
+ "maxPrice": "[if(equals(parameters('vmSpot'),bool('true')),'-1',json('null'))]"
+ },
+ "priority": "[if(equals(parameters('vmSpot'),bool('true')),'Spot',json('null'))]",
+ "evictionPolicy": "[if(equals(parameters('vmSpot'),bool('true')),'Deallocate',json('null'))]",
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "storageDiagUrl"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ }
+ ]
+ },
+ "osProfile": {
+ "adminUsername": "GEN-UNIQUE-5",
+ "adminPassword": "GEN-PASSWORD",
+ "computerName": "[concat(parameters('vmName'),copyIndex(1))]"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Standard_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/dscext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[not(empty(parameters('dscFunction')))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.11",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('dscLocation'),concat('dsc/',parameters('dscScriptName'),parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "dscFunction",
+ "Properties": {
+ "AdminCreds": {
+ "UserName": "GEN-UNIQUE-5",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ },
+ "RDSParameters": [
+ {
+ "timeZoneID": "UTC",
+ "DomainName": "contoso.com",
+ "DNSServer": "firstDcIP",
+ "MainConnectionBroker": "MainConnectionBroker",
+ "WebAccessServer": "WebAccessServerName1",
+ "SessionHost": "SessionHostName1",
+ "LicenseServer": "LicenseServerName1",
+ "externalFqdn": "externalFqdn",
+ "externalDnsDomain": "contosocorp.com",
+ "IntBrokerLBIP": "intLbBrokerIP",
+ "IntWebGWLBIP": "intLbWebGWIP",
+ "WebGWDNS": "webGwName"
+ }
+ ]
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "GEN-PASSWORD"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/pwshext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[and(contains(parameters('vmName'),'cb'),parameters('deployHA'))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]",
+ "[resourceId('Microsoft.Compute/virtualMachines/extensions',concat(parameters('vmName'),copyIndex(1)),'dscext')]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.10",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptPath"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "powershell -ExecutionPolicy Bypass -File ./scriptName -AdminUser GEN-UNIQUE-5 -Passwd GEN-PASSWORD -MainConnectionBroker MainConnectionBroker -BrokerFqdn brokerFqdn -WebGatewayFqdn externalFqdn -AzureSQLFQDN azureSqlFqdn -AzureSQLDBName rdsDBName -WebAccessServerName WebAccessServerName -WebAccessServerCount WebAccessServerCount -SessionHostName SessionHostName -SessionHostCount SessionHostCount -LicenseServerName LicenseServerName -LicenseServerCount LicenseServerCount"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(variables('vmProperties')[copyIndex()].name,'Deployment')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/virtualNetworks',concat(parameters('projectName'),'vnet'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'publb'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))]",
+ "[resourceId('Microsoft.Sql/servers/databases',variables('sqlServerName'),variables('rdsDBName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "timeZoneID": {
+ "value": "UTC"
+ },
+ "loopCount": {
+ "value": "(vmProperties)[copyIndex()].count"
+ },
+ "storageDiagUrl": {
+ "value": "[reference(resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))).primaryEndpoints.blob]"
+ },
+ "vmName": {
+ "value": "(vmProperties)[copyIndex()].name"
+ },
+ "subNetRef": {
+ "value": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main"
+ },
+ "vmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "vmSpot": {
+ "value": true
+ },
+ "vmStorageSkuType": {
+ "value": "Standard_LRS"
+ },
+ "adminUser": {
+ "value": "GEN-UNIQUE-5"
+ },
+ "adminPasswd": {
+ "value": "GEN-PASSWORD"
+ },
+ "intLbName": {
+ "value": "GEN-UNIQUE-5intlb"
+ },
+ "intLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].intLbBackEndPool"
+ },
+ "intLbBrokerIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[0].properties.privateIPAddress]"
+ },
+ "intLbWebGWIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[1].properties.privateIPAddress]"
+ },
+ "pubLbName": {
+ "value": "GEN-UNIQUE-5publb"
+ },
+ "pubLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].pubLbBackEndPool"
+ },
+ "adDomainName": {
+ "value": "contoso.com"
+ },
+ "firstDcIP": {
+ "value": "10.100.0.99"
+ },
+ "dcName": {
+ "value": "(vmProperties)[0].name"
+ },
+ "MainConnectionBroker": {
+ "value": "[concat(variables('vmProperties')[2].name,'1')]"
+ },
+ "WebAccessServerName": {
+ "value": "(vmProperties)[1].name"
+ },
+ "WebAccessServerCount": {
+ "value": "(vmProperties)[1].count"
+ },
+ "SessionHostName": {
+ "value": "(vmProperties)[3].name"
+ },
+ "SessionHostCount": {
+ "value": "(vmProperties)[3].count"
+ },
+ "LicenseServerName": {
+ "value": "(vmProperties)[4].name"
+ },
+ "LicenseServerCount": {
+ "value": "(vmProperties)[4].count"
+ },
+ "externalFqdn": {
+ "value": "[variables('externalFqdn')]"
+ },
+ "brokerFqdn": {
+ "value": "[variables('brokerFqdn')]"
+ },
+ "externalDnsZone": {
+ "value": "contosocorp.com"
+ },
+ "dscFunction": {
+ "value": "(vmProperties)[copyIndex()].dscFunction"
+ },
+ "dscLocation": {
+ "value": "[deployment().properties.templatelink.uri]"
+ },
+ "dscScriptName": {
+ "value": "deployrdslab.zip"
+ },
+ "scriptName": {
+ "value": "deploycertha.ps1"
+ },
+ "deployHA": {
+ "value": false
+ },
+ "rdsDBName": {
+ "value": "rdsdb"
+ },
+ "azureSqlFqdn": {
+ "value": "[reference(resourceId('Microsoft.Sql/servers',variables('sqlServerName'))).fullyQualifiedDomainName]"
+ },
+ "webGwName": {
+ "value": "remoteapps"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "timeZoneID": {
+ "type": "string"
+ },
+ "loopCount": {
+ "type": "int"
+ },
+ "storageDiagUrl": {
+ "type": "string"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "subNetRef": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmSpot": {
+ "type": "bool"
+ },
+ "vmStorageSkuType": {
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "type": "string"
+ },
+ "adminUser": {
+ "type": "string"
+ },
+ "adminPasswd": {
+ "type": "securestring"
+ },
+ "intLbName": {
+ "type": "string"
+ },
+ "intLbBackEndPool": {
+ "type": "string"
+ },
+ "intLbBrokerIP": {
+ "type": "string"
+ },
+ "intLbWebGWIP": {
+ "type": "string"
+ },
+ "pubLbName": {
+ "type": "string"
+ },
+ "pubLbBackEndPool": {
+ "type": "string"
+ },
+ "adDomainName": {
+ "type": "string"
+ },
+ "firstDcIP": {
+ "type": "string"
+ },
+ "dcName": {
+ "type": "string"
+ },
+ "MainConnectionBroker": {
+ "type": "string"
+ },
+ "WebAccessServerName": {
+ "type": "string"
+ },
+ "WebAccessServerCount": {
+ "type": "int"
+ },
+ "SessionHostName": {
+ "type": "string"
+ },
+ "SessionHostCount": {
+ "type": "int"
+ },
+ "LicenseServerName": {
+ "type": "string"
+ },
+ "LicenseServerCount": {
+ "type": "int"
+ },
+ "externalFqdn": {
+ "type": "string"
+ },
+ "brokerFqdn": {
+ "type": "string"
+ },
+ "externalDnsZone": {
+ "type": "string"
+ },
+ "dscFunction": {
+ "type": "string"
+ },
+ "dscLocation": {
+ "type": "string"
+ },
+ "dscScriptName": {
+ "type": "string"
+ },
+ "scriptName": {
+ "type": "string"
+ },
+ "deployHA": {
+ "type": "bool"
+ },
+ "rdsDBName": {
+ "type": "string"
+ },
+ "azureSQLFqdn": {
+ "type": "string"
+ },
+ "webGwName": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "scriptPath": "[uri(parameters('dscLocation'),concat('scripts/',parameters('scriptName'),parameters('_artifactsLocationSasToken')))]",
+ "intlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ }
+ ],
+ "pubIntlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ },
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/pubLbName/pubLbBackEndPool"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-07-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'pip')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "copy": {
+ "name": "vmNamepipcopy",
+ "count": "loopCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "[concat(parameters('vmName'),'pip',copyIndex(1))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'nic1')]",
+ "copy": {
+ "name": "vmNameniccopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "subNetRef"
+ },
+ "privateIPAllocationMethod": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),'static','dynamic'),'dynamic')]",
+ "privateIPAddress": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),parameters('firstDcIP'),json('null')),json('null'))]",
+ "publicIPAddress": {
+ "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ },
+ "loadBalancerBackendAddressPools": "[if(not(empty(parameters('intLbBackEndPool'))),if(not(empty(parameters('pubLbBackEndPool'))),variables('pubIntlbPool'),variables('intlbPool')),json('null'))]"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1))]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmNamevmcopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ ],
+ "properties": {
+ "licenseType": "Windows_Server",
+ "billingProfile": {
+ "maxPrice": "[if(equals(parameters('vmSpot'),bool('true')),'-1',json('null'))]"
+ },
+ "priority": "[if(equals(parameters('vmSpot'),bool('true')),'Spot',json('null'))]",
+ "evictionPolicy": "[if(equals(parameters('vmSpot'),bool('true')),'Deallocate',json('null'))]",
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "storageDiagUrl"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ }
+ ]
+ },
+ "osProfile": {
+ "adminUsername": "GEN-UNIQUE-5",
+ "adminPassword": "GEN-PASSWORD",
+ "computerName": "[concat(parameters('vmName'),copyIndex(1))]"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Standard_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/dscext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[not(empty(parameters('dscFunction')))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.11",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('dscLocation'),concat('dsc/',parameters('dscScriptName'),parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "dscFunction",
+ "Properties": {
+ "AdminCreds": {
+ "UserName": "GEN-UNIQUE-5",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ },
+ "RDSParameters": [
+ {
+ "timeZoneID": "UTC",
+ "DomainName": "contoso.com",
+ "DNSServer": "firstDcIP",
+ "MainConnectionBroker": "MainConnectionBroker",
+ "WebAccessServer": "WebAccessServerName1",
+ "SessionHost": "SessionHostName1",
+ "LicenseServer": "LicenseServerName1",
+ "externalFqdn": "externalFqdn",
+ "externalDnsDomain": "contosocorp.com",
+ "IntBrokerLBIP": "intLbBrokerIP",
+ "IntWebGWLBIP": "intLbWebGWIP",
+ "WebGWDNS": "webGwName"
+ }
+ ]
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "GEN-PASSWORD"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/pwshext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[and(contains(parameters('vmName'),'cb'),parameters('deployHA'))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]",
+ "[resourceId('Microsoft.Compute/virtualMachines/extensions',concat(parameters('vmName'),copyIndex(1)),'dscext')]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.10",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptPath"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "powershell -ExecutionPolicy Bypass -File ./scriptName -AdminUser GEN-UNIQUE-5 -Passwd GEN-PASSWORD -MainConnectionBroker MainConnectionBroker -BrokerFqdn brokerFqdn -WebGatewayFqdn externalFqdn -AzureSQLFQDN azureSqlFqdn -AzureSQLDBName rdsDBName -WebAccessServerName WebAccessServerName -WebAccessServerCount WebAccessServerCount -SessionHostName SessionHostName -SessionHostCount SessionHostCount -LicenseServerName LicenseServerName -LicenseServerCount LicenseServerCount"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(variables('vmProperties')[copyIndex()].name,'Deployment')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/virtualNetworks',concat(parameters('projectName'),'vnet'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'publb'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))]",
+ "[resourceId('Microsoft.Sql/servers/databases',variables('sqlServerName'),variables('rdsDBName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "timeZoneID": {
+ "value": "UTC"
+ },
+ "loopCount": {
+ "value": "(vmProperties)[copyIndex()].count"
+ },
+ "storageDiagUrl": {
+ "value": "[reference(resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))).primaryEndpoints.blob]"
+ },
+ "vmName": {
+ "value": "(vmProperties)[copyIndex()].name"
+ },
+ "subNetRef": {
+ "value": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main"
+ },
+ "vmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "vmSpot": {
+ "value": true
+ },
+ "vmStorageSkuType": {
+ "value": "Standard_LRS"
+ },
+ "adminUser": {
+ "value": "GEN-UNIQUE-5"
+ },
+ "adminPasswd": {
+ "value": "GEN-PASSWORD"
+ },
+ "intLbName": {
+ "value": "GEN-UNIQUE-5intlb"
+ },
+ "intLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].intLbBackEndPool"
+ },
+ "intLbBrokerIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[0].properties.privateIPAddress]"
+ },
+ "intLbWebGWIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[1].properties.privateIPAddress]"
+ },
+ "pubLbName": {
+ "value": "GEN-UNIQUE-5publb"
+ },
+ "pubLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].pubLbBackEndPool"
+ },
+ "adDomainName": {
+ "value": "contoso.com"
+ },
+ "firstDcIP": {
+ "value": "10.100.0.99"
+ },
+ "dcName": {
+ "value": "(vmProperties)[0].name"
+ },
+ "MainConnectionBroker": {
+ "value": "[concat(variables('vmProperties')[2].name,'1')]"
+ },
+ "WebAccessServerName": {
+ "value": "(vmProperties)[1].name"
+ },
+ "WebAccessServerCount": {
+ "value": "(vmProperties)[1].count"
+ },
+ "SessionHostName": {
+ "value": "(vmProperties)[3].name"
+ },
+ "SessionHostCount": {
+ "value": "(vmProperties)[3].count"
+ },
+ "LicenseServerName": {
+ "value": "(vmProperties)[4].name"
+ },
+ "LicenseServerCount": {
+ "value": "(vmProperties)[4].count"
+ },
+ "externalFqdn": {
+ "value": "[variables('externalFqdn')]"
+ },
+ "brokerFqdn": {
+ "value": "[variables('brokerFqdn')]"
+ },
+ "externalDnsZone": {
+ "value": "contosocorp.com"
+ },
+ "dscFunction": {
+ "value": "(vmProperties)[copyIndex()].dscFunction"
+ },
+ "dscLocation": {
+ "value": "[deployment().properties.templatelink.uri]"
+ },
+ "dscScriptName": {
+ "value": "deployrdslab.zip"
+ },
+ "scriptName": {
+ "value": "deploycertha.ps1"
+ },
+ "deployHA": {
+ "value": false
+ },
+ "rdsDBName": {
+ "value": "rdsdb"
+ },
+ "azureSqlFqdn": {
+ "value": "[reference(resourceId('Microsoft.Sql/servers',variables('sqlServerName'))).fullyQualifiedDomainName]"
+ },
+ "webGwName": {
+ "value": "remoteapps"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "timeZoneID": {
+ "type": "string"
+ },
+ "loopCount": {
+ "type": "int"
+ },
+ "storageDiagUrl": {
+ "type": "string"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "subNetRef": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmSpot": {
+ "type": "bool"
+ },
+ "vmStorageSkuType": {
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "type": "string"
+ },
+ "adminUser": {
+ "type": "string"
+ },
+ "adminPasswd": {
+ "type": "securestring"
+ },
+ "intLbName": {
+ "type": "string"
+ },
+ "intLbBackEndPool": {
+ "type": "string"
+ },
+ "intLbBrokerIP": {
+ "type": "string"
+ },
+ "intLbWebGWIP": {
+ "type": "string"
+ },
+ "pubLbName": {
+ "type": "string"
+ },
+ "pubLbBackEndPool": {
+ "type": "string"
+ },
+ "adDomainName": {
+ "type": "string"
+ },
+ "firstDcIP": {
+ "type": "string"
+ },
+ "dcName": {
+ "type": "string"
+ },
+ "MainConnectionBroker": {
+ "type": "string"
+ },
+ "WebAccessServerName": {
+ "type": "string"
+ },
+ "WebAccessServerCount": {
+ "type": "int"
+ },
+ "SessionHostName": {
+ "type": "string"
+ },
+ "SessionHostCount": {
+ "type": "int"
+ },
+ "LicenseServerName": {
+ "type": "string"
+ },
+ "LicenseServerCount": {
+ "type": "int"
+ },
+ "externalFqdn": {
+ "type": "string"
+ },
+ "brokerFqdn": {
+ "type": "string"
+ },
+ "externalDnsZone": {
+ "type": "string"
+ },
+ "dscFunction": {
+ "type": "string"
+ },
+ "dscLocation": {
+ "type": "string"
+ },
+ "dscScriptName": {
+ "type": "string"
+ },
+ "scriptName": {
+ "type": "string"
+ },
+ "deployHA": {
+ "type": "bool"
+ },
+ "rdsDBName": {
+ "type": "string"
+ },
+ "azureSQLFqdn": {
+ "type": "string"
+ },
+ "webGwName": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "scriptPath": "[uri(parameters('dscLocation'),concat('scripts/',parameters('scriptName'),parameters('_artifactsLocationSasToken')))]",
+ "intlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ }
+ ],
+ "pubIntlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ },
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/pubLbName/pubLbBackEndPool"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-07-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'pip')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "copy": {
+ "name": "vmNamepipcopy",
+ "count": "loopCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "[concat(parameters('vmName'),'pip',copyIndex(1))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'nic1')]",
+ "copy": {
+ "name": "vmNameniccopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "subNetRef"
+ },
+ "privateIPAllocationMethod": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),'static','dynamic'),'dynamic')]",
+ "privateIPAddress": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),parameters('firstDcIP'),json('null')),json('null'))]",
+ "publicIPAddress": {
+ "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ },
+ "loadBalancerBackendAddressPools": "[if(not(empty(parameters('intLbBackEndPool'))),if(not(empty(parameters('pubLbBackEndPool'))),variables('pubIntlbPool'),variables('intlbPool')),json('null'))]"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1))]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmNamevmcopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ ],
+ "properties": {
+ "licenseType": "Windows_Server",
+ "billingProfile": {
+ "maxPrice": "[if(equals(parameters('vmSpot'),bool('true')),'-1',json('null'))]"
+ },
+ "priority": "[if(equals(parameters('vmSpot'),bool('true')),'Spot',json('null'))]",
+ "evictionPolicy": "[if(equals(parameters('vmSpot'),bool('true')),'Deallocate',json('null'))]",
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "storageDiagUrl"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ }
+ ]
+ },
+ "osProfile": {
+ "adminUsername": "GEN-UNIQUE-5",
+ "adminPassword": "GEN-PASSWORD",
+ "computerName": "[concat(parameters('vmName'),copyIndex(1))]"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Standard_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/dscext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[not(empty(parameters('dscFunction')))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.11",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('dscLocation'),concat('dsc/',parameters('dscScriptName'),parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "dscFunction",
+ "Properties": {
+ "AdminCreds": {
+ "UserName": "GEN-UNIQUE-5",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ },
+ "RDSParameters": [
+ {
+ "timeZoneID": "UTC",
+ "DomainName": "contoso.com",
+ "DNSServer": "firstDcIP",
+ "MainConnectionBroker": "MainConnectionBroker",
+ "WebAccessServer": "WebAccessServerName1",
+ "SessionHost": "SessionHostName1",
+ "LicenseServer": "LicenseServerName1",
+ "externalFqdn": "externalFqdn",
+ "externalDnsDomain": "contosocorp.com",
+ "IntBrokerLBIP": "intLbBrokerIP",
+ "IntWebGWLBIP": "intLbWebGWIP",
+ "WebGWDNS": "webGwName"
+ }
+ ]
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "GEN-PASSWORD"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/pwshext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[and(contains(parameters('vmName'),'cb'),parameters('deployHA'))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]",
+ "[resourceId('Microsoft.Compute/virtualMachines/extensions',concat(parameters('vmName'),copyIndex(1)),'dscext')]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.10",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptPath"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "powershell -ExecutionPolicy Bypass -File ./scriptName -AdminUser GEN-UNIQUE-5 -Passwd GEN-PASSWORD -MainConnectionBroker MainConnectionBroker -BrokerFqdn brokerFqdn -WebGatewayFqdn externalFqdn -AzureSQLFQDN azureSqlFqdn -AzureSQLDBName rdsDBName -WebAccessServerName WebAccessServerName -WebAccessServerCount WebAccessServerCount -SessionHostName SessionHostName -SessionHostCount SessionHostCount -LicenseServerName LicenseServerName -LicenseServerCount LicenseServerCount"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2021-04-01",
+ "name": "[concat(variables('vmProperties')[copyIndex()].name,'Deployment')]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/virtualNetworks',concat(parameters('projectName'),'vnet'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))]",
+ "[resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'publb'))]",
+ "[resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))]",
+ "[resourceId('Microsoft.Sql/servers/databases',variables('sqlServerName'),variables('rdsDBName'))]"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "expressionEvaluationOptions": {
+ "scope": "inner"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "timeZoneID": {
+ "value": "UTC"
+ },
+ "loopCount": {
+ "value": "(vmProperties)[copyIndex()].count"
+ },
+ "storageDiagUrl": {
+ "value": "[reference(resourceId('Microsoft.Storage/storageAccounts',variables('diagStorageName'))).primaryEndpoints.blob]"
+ },
+ "vmName": {
+ "value": "(vmProperties)[copyIndex()].name"
+ },
+ "subNetRef": {
+ "value": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-5vnet/GEN-UNIQUE-5main"
+ },
+ "vmSize": {
+ "value": "Standard_A2_v2"
+ },
+ "vmSpot": {
+ "value": true
+ },
+ "vmStorageSkuType": {
+ "value": "Standard_LRS"
+ },
+ "adminUser": {
+ "value": "GEN-UNIQUE-5"
+ },
+ "adminPasswd": {
+ "value": "GEN-PASSWORD"
+ },
+ "intLbName": {
+ "value": "GEN-UNIQUE-5intlb"
+ },
+ "intLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].intLbBackEndPool"
+ },
+ "intLbBrokerIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[0].properties.privateIPAddress]"
+ },
+ "intLbWebGWIP": {
+ "value": "[reference(resourceId('Microsoft.Network/loadBalancers',concat(parameters('projectName'),'intlb'))).frontendIPConfigurations[1].properties.privateIPAddress]"
+ },
+ "pubLbName": {
+ "value": "GEN-UNIQUE-5publb"
+ },
+ "pubLbBackEndPool": {
+ "value": "(vmProperties)[copyIndex()].pubLbBackEndPool"
+ },
+ "adDomainName": {
+ "value": "contoso.com"
+ },
+ "firstDcIP": {
+ "value": "10.100.0.99"
+ },
+ "dcName": {
+ "value": "(vmProperties)[0].name"
+ },
+ "MainConnectionBroker": {
+ "value": "[concat(variables('vmProperties')[2].name,'1')]"
+ },
+ "WebAccessServerName": {
+ "value": "(vmProperties)[1].name"
+ },
+ "WebAccessServerCount": {
+ "value": "(vmProperties)[1].count"
+ },
+ "SessionHostName": {
+ "value": "(vmProperties)[3].name"
+ },
+ "SessionHostCount": {
+ "value": "(vmProperties)[3].count"
+ },
+ "LicenseServerName": {
+ "value": "(vmProperties)[4].name"
+ },
+ "LicenseServerCount": {
+ "value": "(vmProperties)[4].count"
+ },
+ "externalFqdn": {
+ "value": "[variables('externalFqdn')]"
+ },
+ "brokerFqdn": {
+ "value": "[variables('brokerFqdn')]"
+ },
+ "externalDnsZone": {
+ "value": "contosocorp.com"
+ },
+ "dscFunction": {
+ "value": "(vmProperties)[copyIndex()].dscFunction"
+ },
+ "dscLocation": {
+ "value": "[deployment().properties.templatelink.uri]"
+ },
+ "dscScriptName": {
+ "value": "deployrdslab.zip"
+ },
+ "scriptName": {
+ "value": "deploycertha.ps1"
+ },
+ "deployHA": {
+ "value": false
+ },
+ "rdsDBName": {
+ "value": "rdsdb"
+ },
+ "azureSqlFqdn": {
+ "value": "[reference(resourceId('Microsoft.Sql/servers',variables('sqlServerName'))).fullyQualifiedDomainName]"
+ },
+ "webGwName": {
+ "value": "remoteapps"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ },
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "timeZoneID": {
+ "type": "string"
+ },
+ "loopCount": {
+ "type": "int"
+ },
+ "storageDiagUrl": {
+ "type": "string"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "subNetRef": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmSpot": {
+ "type": "bool"
+ },
+ "vmStorageSkuType": {
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "type": "string"
+ },
+ "adminUser": {
+ "type": "string"
+ },
+ "adminPasswd": {
+ "type": "securestring"
+ },
+ "intLbName": {
+ "type": "string"
+ },
+ "intLbBackEndPool": {
+ "type": "string"
+ },
+ "intLbBrokerIP": {
+ "type": "string"
+ },
+ "intLbWebGWIP": {
+ "type": "string"
+ },
+ "pubLbName": {
+ "type": "string"
+ },
+ "pubLbBackEndPool": {
+ "type": "string"
+ },
+ "adDomainName": {
+ "type": "string"
+ },
+ "firstDcIP": {
+ "type": "string"
+ },
+ "dcName": {
+ "type": "string"
+ },
+ "MainConnectionBroker": {
+ "type": "string"
+ },
+ "WebAccessServerName": {
+ "type": "string"
+ },
+ "WebAccessServerCount": {
+ "type": "int"
+ },
+ "SessionHostName": {
+ "type": "string"
+ },
+ "SessionHostCount": {
+ "type": "int"
+ },
+ "LicenseServerName": {
+ "type": "string"
+ },
+ "LicenseServerCount": {
+ "type": "int"
+ },
+ "externalFqdn": {
+ "type": "string"
+ },
+ "brokerFqdn": {
+ "type": "string"
+ },
+ "externalDnsZone": {
+ "type": "string"
+ },
+ "dscFunction": {
+ "type": "string"
+ },
+ "dscLocation": {
+ "type": "string"
+ },
+ "dscScriptName": {
+ "type": "string"
+ },
+ "scriptName": {
+ "type": "string"
+ },
+ "deployHA": {
+ "type": "bool"
+ },
+ "rdsDBName": {
+ "type": "string"
+ },
+ "azureSQLFqdn": {
+ "type": "string"
+ },
+ "webGwName": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "scriptPath": "[uri(parameters('dscLocation'),concat('scripts/',parameters('scriptName'),parameters('_artifactsLocationSasToken')))]",
+ "intlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ }
+ ],
+ "pubIntlbPool": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/intLbName/intLbBackEndPool"
+ },
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/pubLbName/pubLbBackEndPool"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-07-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'pip')]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "copy": {
+ "name": "vmNamepipcopy",
+ "count": "loopCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "[concat(parameters('vmName'),'pip',copyIndex(1))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'nic1')]",
+ "copy": {
+ "name": "vmNameniccopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "subNetRef"
+ },
+ "privateIPAllocationMethod": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),'static','dynamic'),'dynamic')]",
+ "privateIPAddress": "[if(equals(parameters('vmName'),parameters('dcName')),if(equals(copyIndex(1),1),parameters('firstDcIP'),json('null')),json('null'))]",
+ "publicIPAddress": {
+ "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('vmName'),copyIndex(1),'pip'))]"
+ },
+ "loadBalancerBackendAddressPools": "[if(not(empty(parameters('intLbBackEndPool'))),if(not(empty(parameters('pubLbBackEndPool'))),variables('pubIntlbPool'),variables('intlbPool')),json('null'))]"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1))]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmNamevmcopy",
+ "count": "loopCount"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ ],
+ "properties": {
+ "licenseType": "Windows_Server",
+ "billingProfile": {
+ "maxPrice": "[if(equals(parameters('vmSpot'),bool('true')),'-1',json('null'))]"
+ },
+ "priority": "[if(equals(parameters('vmSpot'),bool('true')),'Spot',json('null'))]",
+ "evictionPolicy": "[if(equals(parameters('vmSpot'),bool('true')),'Deallocate',json('null'))]",
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "storageDiagUrl"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName'),copyIndex(1),'nic1'))]"
+ }
+ ]
+ },
+ "osProfile": {
+ "adminUsername": "GEN-UNIQUE-5",
+ "adminPassword": "GEN-PASSWORD",
+ "computerName": "[concat(parameters('vmName'),copyIndex(1))]"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Standard_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/dscext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[not(empty(parameters('dscFunction')))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.11",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('dscLocation'),concat('dsc/',parameters('dscScriptName'),parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "dscFunction",
+ "Properties": {
+ "AdminCreds": {
+ "UserName": "GEN-UNIQUE-5",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ },
+ "RDSParameters": [
+ {
+ "timeZoneID": "UTC",
+ "DomainName": "contoso.com",
+ "DNSServer": "firstDcIP",
+ "MainConnectionBroker": "MainConnectionBroker",
+ "WebAccessServer": "WebAccessServerName1",
+ "SessionHost": "SessionHostName1",
+ "LicenseServer": "LicenseServerName1",
+ "externalFqdn": "externalFqdn",
+ "externalDnsDomain": "contosocorp.com",
+ "IntBrokerLBIP": "intLbBrokerIP",
+ "IntWebGWLBIP": "intLbWebGWIP",
+ "WebGWDNS": "webGwName"
+ }
+ ]
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "GEN-PASSWORD"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2020-12-01",
+ "name": "[concat(parameters('vmName'),copyIndex(1),'/pwshext')]",
+ "location": "[resourceGroup().location]",
+ "condition": "[and(contains(parameters('vmName'),'cb'),parameters('deployHA'))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines',concat(parameters('vmName'),copyIndex(1)))]",
+ "[resourceId('Microsoft.Compute/virtualMachines/extensions',concat(parameters('vmName'),copyIndex(1)),'dscext')]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.10",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptPath"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "powershell -ExecutionPolicy Bypass -File ./scriptName -AdminUser GEN-UNIQUE-5 -Passwd GEN-PASSWORD -MainConnectionBroker MainConnectionBroker -BrokerFqdn brokerFqdn -WebGatewayFqdn externalFqdn -AzureSQLFQDN azureSqlFqdn -AzureSQLDBName rdsDBName -WebAccessServerName WebAccessServerName -WebAccessServerCount WebAccessServerCount -SessionHostName SessionHostName -SessionHostCount SessionHostCount -LicenseServerName LicenseServerName -LicenseServerCount LicenseServerCount"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "adminUser": {
+ "type": "string",
+ "value": "[parameters('adminUser')]"
+ },
+ "WebAccessFQDN": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses',variables('publicLbIpName'))).dnsSettings.fqdn]"
+ },
+ "ExternalFQDN": {
+ "type": "string",
+ "value": "[variables('externalFqdn')]",
+ "condition": "[parameters('deployHA')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT79 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT79
new file mode 100644
index 0000000..e152ad4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT79
@@ -0,0 +1,350 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-ds14.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885575,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-ds14.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT79",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT79",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "singleQuote": "'",
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "GEN-UNIQUE-10-dn",
+ "nicName": "GEN-UNIQUE-10-dn-nic",
+ "publicIPAddressName": "GEN-UNIQUE-10-dn-publicIP",
+ "securityGroupName": "GEN-UNIQUE-10-dn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "GEN-UNIQUE-10-dn-sg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-10-dncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE-10-dn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ ],
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2017-03-30",
+ "name": "GEN-UNIQUE-10-dncopyIndex()",
+ "plan": {
+ "name": "cloudera-centos-6",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-6"
+ },
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": false
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-6",
+ "sku": "cloudera-centos-6",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk1",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk2",
+ "diskSizeGB": 1023,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk3",
+ "diskSizeGB": 1023,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk4",
+ "diskSizeGB": 1023,
+ "lun": 3,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk5",
+ "diskSizeGB": 1023,
+ "lun": 4,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk6",
+ "diskSizeGB": 1023,
+ "lun": 5,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk7",
+ "diskSizeGB": 1023,
+ "lun": 6,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk8",
+ "diskSizeGB": 1023,
+ "lun": 7,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk9",
+ "diskSizeGB": 1023,
+ "lun": 8,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk10",
+ "diskSizeGB": 1023,
+ "lun": 9,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk11",
+ "diskSizeGB": 1023,
+ "lun": 10,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-10-dncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE-10-dncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-datanode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh ', variables('singleQuote'), variables('masterIP'), variables('singleQuote'), ' ', variables('singleQuote'), variables('workerIP'), variables('singleQuote'), ' ', variables('singleQuote'), parameters('dnsNamePrefix'), variables('singleQuote'), ' ', variables('singleQuote'), reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').masterNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').dataNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('vmSpec').adminUsername, variables('singleQuote'), ' ', 'datanode', ' >> /var/log/cloudera-azure-initialize.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT790 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT790
new file mode 100644
index 0000000..af80a74
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT790
@@ -0,0 +1,70 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/resourcegraph-sharedquery-countos/azuredeploy.json",
+ "/demos/resourcegraph-sharedquery-countos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901496,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/resourcegraph-sharedquery-countos/azuredeploy.json",
+ "/demos/resourcegraph-sharedquery-countos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT790",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resourcegraph/queries"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT790",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "queryName": {
+ "defaultValue": "Count VMs by OS",
+ "type": "String",
+ "metadata": {
+ "description": "The name of the shared query."
+ }
+ },
+ "queryCode": {
+ "defaultValue": "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | summarize count() by tostring(properties.storageProfile.osDisk.osType)",
+ "type": "String",
+ "metadata": {
+ "description": "The Azure Resource Graph query to be saved to the shared query."
+ }
+ },
+ "queryDescription": {
+ "defaultValue": "This shared query counts all virtual machine resources and summarizes by the OS type.",
+ "type": "String",
+ "metadata": {
+ "description": "The description of the saved Azure Resource Graph query."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ResourceGraph/queries",
+ "apiVersion": "2018-09-01-preview",
+ "name": "Count VMs by OS",
+ "location": "global",
+ "properties": {
+ "query": "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | summarize count() by tostring(properties.storageProfile.osDisk.osType)",
+ "description": "This shared query counts all virtual machine resources and summarizes by the OS type."
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT791 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT791
new file mode 100644
index 0000000..a75ce82
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT791
@@ -0,0 +1,67 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/s2d-oms-mgmt-solution/prereqs/prereq.azuredeploy.json",
+ "/demos/s2d-oms-mgmt-solution/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901515,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/s2d-oms-mgmt-solution/prereqs/prereq.azuredeploy.json",
+ "/demos/s2d-oms-mgmt-solution/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT791",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT791",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "workspacename": "[concat('omswrkspc',uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "name": "[variables('workspacename')]",
+ "apiVersion": "2020-10-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "Name": "pergb2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "workspaceName": {
+ "type": "string",
+ "value": "[variables('workspacename')]"
+ },
+ "workspaceLocation": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT792 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT792
new file mode 100644
index 0000000..34384df
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT792
@@ -0,0 +1,98 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/albBEPool.json"
+ ],
+ "timestamp": 1642962901560,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/albBEPool.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT792",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT792",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "vmNamePrefix": {
+ "type": "string"
+ },
+ "subnetId": {
+ "type": "string"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "lbBEAddressPoolID": {
+ "type": "string"
+ },
+ "albBEAddressPoolID": {
+ "type": "string"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "name": "vmNamePrefixcopyindex()-nic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "location",
+ "apiVersion": "2020-08-01",
+ "copy": {
+ "name": "lbBEPoolLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "lbBEAddressPoolID"
+ },
+ {
+ "id": "albBEAddressPoolID"
+ }
+ ],
+ "primary": true
+ }
+ },
+ {
+ "name": "ipconfig2",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT793 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT793
new file mode 100644
index 0000000..6cc527f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT793
@@ -0,0 +1,654 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/deploy-sql-cluster.json"
+ ],
+ "timestamp": 1642962901571,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/deploy-sql-cluster.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT793",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.resources/deployments",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT793",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for the VM, only certain regions support zones during preview."
+ }
+ },
+ "namePrefix": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 8,
+ "metadata": {
+ "description": "Naming prefix for each new resource created. 3-char min, 8-char max, lowercase alphanumeric"
+ }
+ },
+ "domainName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS domain name for existing Active Directory domain"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Administrator of the existing Active Directory Domain"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password for the Administrator account of the existing Active Directory Domain"
+ }
+ },
+ "sqlServiceAccount": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the user account to be used for the SQL Server service account"
+ }
+ },
+ "sqlServicePassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password to be used for the SQL Server service account"
+ }
+ },
+ "subnetId": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource ID for existing vnet/subnet to which VM NICs should be attached"
+ }
+ },
+ "enableOutboundInternet": {
+ "type": "string",
+ "allowedValues": [
+ "Yes",
+ "No"
+ ],
+ "metadata": {
+ "description": "Enable outbound Internet access via source NAT to support ongoing VM Agent extension communication needs"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Size of the SQL Server VMs to be created"
+ }
+ },
+ "vmCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 9,
+ "metadata": {
+ "description": "Number of SQL Server VMs to be created in AlwaysOn Availability Group cluster (Min=2, Max=9)"
+ },
+ "defaultValue": 2
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023,
+ "metadata": {
+ "description": "Size of each data disk in GB on each SQL Server VM (Min=128, Max=1023)"
+ }
+ },
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32,
+ "metadata": {
+ "description": "Number of data disks on each SQL Server VM (Min=2, Max=32). Ensure that the VM size you've selected will support this number of data disks."
+ }
+ },
+ "workloadType": {
+ "type": "string",
+ "defaultValue": "GENERAL"
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftSQLServer"
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "SQL2016SP1-WS2016"
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "Enterprise"
+ },
+ "imageVersion": {
+ "type": "string",
+ "defaultValue": "latest"
+ },
+ "_artifactsLocation": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "witnessStorageName": "[concat(parameters('namePrefix'),uniqueString(resourceGroup().id),'cw')]",
+ "witnessStorageType": "Standard_LRS",
+ "vmNamePrefix": "namePrefix-sql-",
+ "clusterName": "namePrefix-sql-c",
+ "vmLoopTemplateURL": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/newVM.json',parameters('_artifactsLocationSasToken')))]",
+ "ipLoopTemplateURL": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/getIpAddress.json',parameters('_artifactsLocationSasToken')))]",
+ "sqlPrepModulesURL": "[uri(parameters('_artifactsLocation'), concat('dsc/prep-sqlao.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "sqlPrepFunction": "PrepSQLAO.ps1\\PrepSQLAO",
+ "sqlConfigModulesURL": "[uri(parameters('_artifactsLocation'), concat('dsc/config-sqlao.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "sqlConfigFunction": "ConfigSQLAO.ps1\\ConfigSQLAO",
+ "agName": "namePrefix-sql-ag",
+ "agListenerName": "namePrefix-sql-agl",
+ "agEpName": "namePrefix-sql-ha",
+ "albName": "namePrefix-sql-alb",
+ "albPip": "namePrefix-sql-albpip",
+ "albPipID": "Microsoft.Network/publicIPAddresses/namePrefix-sql-albpip",
+ "albFE1": "namePrefix-sql-albfe1",
+ "albBE": "namePrefix-sql-albbe",
+ "albBEAddressPoolID": "Microsoft.Network/loadBalancers/backendAddressPools/namePrefix-sql-alb/namePrefix-sql-albbe",
+ "albBEPoolTemplateURL": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/albBEPool.json',parameters('_artifactsLocationSasToken')))]",
+ "albFEConfigID1": "Microsoft.Network/loadBalancers/frontendIPConfigurations/namePrefix-sql-alb/namePrefix-sql-albfe1",
+ "albProbe1": "namePrefix-sql-albp1",
+ "albProbeID1": "Microsoft.Network/loadBalancers/probes/namePrefix-sql-alb/namePrefix-sql-albp1",
+ "lbName": "namePrefix-sql-ilb",
+ "lbFE1": "namePrefix-sql-ilbfe1",
+ "lbBE": "namePrefix-sql-ilbbe",
+ "lbFEConfigID1": "Microsoft.Network/loadBalancers/frontendIPConfigurations/namePrefix-sql-ilb/namePrefix-sql-ilbfe1",
+ "lbBEAddressPoolID": "Microsoft.Network/loadBalancers/backendAddressPools/namePrefix-sql-ilb/namePrefix-sql-ilbbe",
+ "lbProbe1": "namePrefix-sql-ilbp1",
+ "lbProbeID1": "Microsoft.Network/loadBalancers/probes/namePrefix-sql-ilb/namePrefix-sql-ilbp1",
+ "lbBEPoolTemplateURL": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/lbBEPool.json',parameters('_artifactsLocationSasToken')))]",
+ "agListenerPort": 1433,
+ "agProbePort": 59999,
+ "snatTcpPort": 59998,
+ "snatProbePort": 3389,
+ "zones": [
+ "1",
+ "2",
+ "3"
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('witnessStorageName')]",
+ "apiVersion": "2019-06-01",
+ "location": "location",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "namePrefix-sql-ilb",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "location",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "namePrefix-sql-ilbfe1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "namePrefix-sql-ilbbe"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "namePrefix-sql-agl",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/namePrefix-sql-ilb/namePrefix-sql-ilbfe1"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/namePrefix-sql-ilb/namePrefix-sql-ilbbe"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/namePrefix-sql-ilb/namePrefix-sql-ilbp1"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 1433,
+ "backendPort": 1433,
+ "enableFloatingIP": true
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "namePrefix-sql-ilbp1",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 59999,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "namePrefix-sql-albpip",
+ "location": "location",
+ "condition": false,
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "namePrefix-sql-alb",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "location",
+ "condition": false,
+ "dependsOn": [
+ "namePrefix-sql-albpip"
+ ],
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "namePrefix-sql-albfe1",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/namePrefix-sql-albpip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "namePrefix-sql-albbe"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "outbound-snat-rule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/namePrefix-sql-alb/namePrefix-sql-albfe1"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/namePrefix-sql-alb/namePrefix-sql-albbe"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/namePrefix-sql-alb/namePrefix-sql-albp1"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 59998,
+ "backendPort": 59998,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "namePrefix-sql-albp1",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 3389,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "namePrefix-sql-copyindex()-nic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "location",
+ "apiVersion": "2020-08-01",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "primary": true
+ }
+ },
+ {
+ "name": "ipconfig2",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "namePrefix-sql-0-clusterIp",
+ "dependsOn": [
+ "nicLoop"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/getIpAddress.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "ipConfig": {
+ "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmNamePrefix'), '0-nic'))).ipConfigurations[1].properties.privateIPAddress]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "copy": {
+ "name": "clusterIpLoop",
+ "count": "[sub(parameters('vmCount'),1)]"
+ },
+ "name": "[concat(variables('vmNamePrefix'),copyIndex(1),'-clusterIp')]",
+ "dependsOn": [
+ "nicLoop",
+ "Microsoft.Resources/deployments/namePrefix-sql-0-clusterIp"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/getIpAddress.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "ipConfig": {
+ "value": "[reference(resourceId('Microsoft.Network/networkInterfaces',concat(variables('vmNamePrefix'), copyIndex(1), '-nic'))).ipConfigurations[1].properties.privateIPAddress]"
+ },
+ "ipAddresses": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', concat(variables('vmNamePrefix'),copyIndex(),'-clusterIp'))).outputs.result.value]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "name": "namePrefix-sql-copyindex()-newVM",
+ "dependsOn": [
+ "nicLoop"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/newVM.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "location"
+ },
+ "vmName": {
+ "value": "namePrefix-sql-copyindex()"
+ },
+ "vmSize": {
+ "value": "vmSize"
+ },
+ "vmDiskCount": {
+ "value": "vmDiskCount"
+ },
+ "vmDiskSize": {
+ "value": "vmDiskSize"
+ },
+ "adminUsername": {
+ "value": "adminUsername"
+ },
+ "adminPassword": {
+ "value": "adminPassword"
+ },
+ "imagePublisher": {
+ "value": "MicrosoftSQLServer"
+ },
+ "imageOffer": {
+ "value": "SQL2016SP1-WS2016"
+ },
+ "imageSKU": {
+ "value": "Enterprise"
+ },
+ "imageVersion": {
+ "value": "latest"
+ },
+ "zones": {
+ "value": "[take(skip(variables('zones'),mod(copyIndex(),length(variables('zones')))),1)]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmNamePrefix'),copyindex(1),'/sqlPrep')]",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "virtualMachineLoop"
+ ],
+ "copy": {
+ "name": "virtualMachineExtensionLoop",
+ "count": "[sub(parameters('vmCount'),1)]"
+ },
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.71",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "[uri(parameters('_artifactsLocation'), concat('dsc/prep-sqlao.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "configurationFunction": "PrepSQLAO.ps1\\PrepSQLAO",
+ "properties": {
+ "domainName": "domainName",
+ "adminCreds": {
+ "userName": "adminUserName",
+ "password": "PrivateSettingsRef:adminPassword"
+ },
+ "sqlServiceCreds": {
+ "userName": "sqlServiceAccount",
+ "password": "PrivateSettingsRef:sqlServicePassword"
+ },
+ "numberOfDisks": "vmDiskCount",
+ "workloadType": "GENERAL",
+ "databaseEnginePort": 1433,
+ "probePortNumber": 59999
+ }
+ },
+ "protectedSettings": {
+ "items": {
+ "adminPassword": "adminPassword",
+ "sqlServicePassword": "sqlServicePassword"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namePrefix-sql-0/sqlConfig",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "virtualMachineLoop",
+ "virtualMachineExtensionLoop",
+ "clusterIpLoop",
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('witnessStorageName'))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.71",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "[uri(parameters('_artifactsLocation'), concat('dsc/config-sqlao.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "configurationFunction": "ConfigSQLAO.ps1\\ConfigSQLAO",
+ "properties": {
+ "domainName": "domainName",
+ "clusterName": "namePrefix-sql-c",
+ "vmNamePrefix": "namePrefix-sql-",
+ "sqlAlwaysOnAvailabilityGroupName": "namePrefix-sql-ag",
+ "sqlAlwaysOnAvailabilityGroupListenerName": "namePrefix-sql-agl",
+ "sqlAlwaysOnEndpointName": "namePrefix-sql-ha",
+ "vmCount": 2,
+ "clusterIpAddresses": "[reference(resourceId('Microsoft.Resources/deployments', concat(variables('vmNamePrefix'),sub(parameters('vmCount'),1),'-clusterIp'))).outputs.result.value]",
+ "agListenerIpAddress": "[reference(resourceId('Microsoft.Network/loadbalancers', variables('lbName'))).frontendIPConfigurations[0].properties.privateIPAddress]",
+ "numberOfDisks": "vmDiskCount",
+ "workloadType": "GENERAL",
+ "databaseEnginePort": 1433,
+ "probePortNumber": 59999,
+ "witnessStorageName": "[variables('witnessStorageName')]",
+ "witnessStorageKey": {
+ "userName": "PLACEHOLDER-DO-NOT-USE",
+ "password": "PrivateSettingsRef:witnessStorageKey"
+ },
+ "adminCreds": {
+ "userName": "adminUserName",
+ "password": "PrivateSettingsRef:adminPassword"
+ },
+ "sqlServiceCreds": {
+ "userName": "sqlServiceAccount",
+ "password": "PrivateSettingsRef:sqlServicePassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "items": {
+ "adminPassword": "adminPassword",
+ "sqlServicePassword": "sqlServicePassword",
+ "witnessStorageKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts',variables('witnessStorageName')), '2019-06-01').keys[0].value]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "namePrefix-sql-lbbepool",
+ "condition": false,
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/extensions/namePrefix-sql-0/sqlConfig"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/lbBEPool.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "location"
+ },
+ "vmNamePrefix": {
+ "value": "namePrefix-sql-"
+ },
+ "vmCount": {
+ "value": 2
+ },
+ "subnetId": {
+ "value": "subnetId"
+ },
+ "lbBEAddressPoolID": {
+ "value": "Microsoft.Network/loadBalancers/backendAddressPools/namePrefix-sql-ilb/namePrefix-sql-ilbbe"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "namePrefix-sql-albbepool",
+ "condition": false,
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/extensions/namePrefix-sql-0/sqlConfig"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/albBEPool.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "location"
+ },
+ "vmNamePrefix": {
+ "value": "namePrefix-sql-"
+ },
+ "vmCount": {
+ "value": 2
+ },
+ "subnetId": {
+ "value": "subnetId"
+ },
+ "lbBEAddressPoolID": {
+ "value": "Microsoft.Network/loadBalancers/backendAddressPools/namePrefix-sql-ilb/namePrefix-sql-ilbbe"
+ },
+ "albBEAddressPoolID": {
+ "value": "Microsoft.Network/loadBalancers/backendAddressPools/namePrefix-sql-alb/namePrefix-sql-albbe"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "agListenerName": {
+ "type": "string",
+ "value": "[variables('agListenerName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT794 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT794
new file mode 100644
index 0000000..7345aa9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT794
@@ -0,0 +1,48 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/getIpAddress.json"
+ ],
+ "timestamp": 1642962901587,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/getIpAddress.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT794",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": []
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT794",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "ipConfig": {
+ "type": "string"
+ },
+ "ipAddresses": {
+ "type": "array",
+ "defaultValue": []
+ }
+ },
+ "variables": {},
+ "resources": [],
+ "outputs": {
+ "result": {
+ "type": "array",
+ "value": "[concat(parameters('ipAddresses'),split(parameters('ipConfig'),','))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT795 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT795
new file mode 100644
index 0000000..6703986
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT795
@@ -0,0 +1,92 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/lbBEPool.json"
+ ],
+ "timestamp": 1642962901597,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/lbBEPool.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT795",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT795",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "vmNamePrefix": {
+ "type": "string"
+ },
+ "subnetId": {
+ "type": "string"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "lbBEAddressPoolID": {
+ "type": "string"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "name": "vmNamePrefixcopyindex()-nic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "location",
+ "apiVersion": "2020-08-01",
+ "copy": {
+ "name": "lbBEPoolLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "lbBEAddressPoolID"
+ }
+ ],
+ "primary": true
+ }
+ },
+ {
+ "name": "ipconfig2",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnetId"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT796 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT796
new file mode 100644
index 0000000..b9f3dfa
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT796
@@ -0,0 +1,128 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/newVM.json"
+ ],
+ "timestamp": 1642962901609,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/nestedtemplates/newVM.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT796",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT796",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmDiskCount": {
+ "type": "int"
+ },
+ "vmDiskSize": {
+ "type": "int"
+ },
+ "adminUsername": {
+ "type": "string"
+ },
+ "adminPassword": {
+ "type": "securestring"
+ },
+ "imagePublisher": {
+ "type": "string"
+ },
+ "imageOffer": {
+ "type": "string"
+ },
+ "imageSKU": {
+ "type": "string"
+ },
+ "imageVersion": {
+ "type": "string"
+ },
+ "zones": {
+ "type": "array"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "name": "vmName",
+ "zones": "zones",
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "imagePublisher",
+ "offer": "imageOffer",
+ "sku": "imageSku",
+ "version": "imageVersion"
+ },
+ "osDisk": {
+ "name": "vmName-osdisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "copy": [
+ {
+ "name": "dataDisks",
+ "count": "vmDiskCount",
+ "input": {
+ "diskSizeGB": "vmDiskSize",
+ "lun": "[copyIndex('dataDisks')]",
+ "createOption": "Empty"
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmName-nic"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vmName": {
+ "type": "string",
+ "value": "[parameters('vmName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT797 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT797
new file mode 100644
index 0000000..9c7d862
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT797
@@ -0,0 +1,117 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.json",
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901629,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.json",
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT797",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT797",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "value": "quickstarts"
+ },
+ "adminPassword": {
+ "type": "secureString"
+ },
+ "domainName": {
+ "type": "string",
+ "value": "corp.mydomain.com"
+ },
+ "dnsPrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "value": "eastus2"
+ }
+ },
+ "resources": [
+ {
+ "name": "createADController",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/modules/active-directory-new-domain/0.9/azuredeploy.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "quickstarts"
+ },
+ "adminPassword": {
+ "value": "adminPassword"
+ },
+ "domainName": {
+ "value": "corp.mydomain.com"
+ },
+ "dnsPrefix": {
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "value": "eastus2"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "dnsIpAddress": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.dnsIpAddress.value]"
+ },
+ "domainName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.domainName.value]"
+ },
+ "virtualNetworkSubscriptionId": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkSubscriptionId.value]"
+ },
+ "virtualNetworkResourceGroupName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkResourceGroupName.value]"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkName.value]"
+ },
+ "virtualNetworkSubnetName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkSubnetName.value]"
+ },
+ "location": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT798 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT798
new file mode 100644
index 0000000..e061c88
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT798
@@ -0,0 +1,117 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.json",
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962901663,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.json",
+ "/demos/sql-alwayson-md-ilb-zones/prereqs/prereq.azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT798",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT798",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "value": "quickstarts"
+ },
+ "adminPassword": {
+ "type": "secureString"
+ },
+ "domainName": {
+ "type": "string",
+ "value": "corp.mydomain.com"
+ },
+ "dnsPrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "value": "usgovvirginia"
+ }
+ },
+ "resources": [
+ {
+ "name": "createADController",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/modules/active-directory-new-domain/0.9/azuredeploy.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "quickstarts"
+ },
+ "adminPassword": {
+ "value": "adminPassword"
+ },
+ "domainName": {
+ "value": "corp.mydomain.com"
+ },
+ "dnsPrefix": {
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "value": "usgovvirginia"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "dnsIpAddress": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.dnsIpAddress.value]"
+ },
+ "domainName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.domainName.value]"
+ },
+ "virtualNetworkSubscriptionId": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkSubscriptionId.value]"
+ },
+ "virtualNetworkResourceGroupName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkResourceGroupName.value]"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkName.value]"
+ },
+ "virtualNetworkSubnetName": {
+ "type": "string",
+ "value": "[reference('createADController').outputs.virtualNetworkSubnetName.value]"
+ },
+ "location": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT799 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT799
new file mode 100644
index 0000000..9710fc7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT799
@@ -0,0 +1,283 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/azuredeploy.json",
+ "/demos/sql-alwayson-md-ilb-zones/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901673,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-alwayson-md-ilb-zones/azuredeploy.json",
+ "/demos/sql-alwayson-md-ilb-zones/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT799",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT799",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure region that supports Availability Zones"
+ },
+ "value": "GET-PREREQ-location"
+ },
+ "namePrefix": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 8,
+ "metadata": {
+ "description": "Naming prefix for each new resource created. 3-char min, 8-char max, lowercase alphanumeric"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Size of the SQL Server VMs to be created"
+ },
+ "defaultValue": "Standard_D4s_v3"
+ },
+ "sqlVMImage": {
+ "type": "string",
+ "allowedValues": [
+ "SQL2016SP1-WS2016",
+ "SQL2016SP1-WS2016-BYOL",
+ "SQL2017-WS2016",
+ "SQL2017-WS2016-BYOL"
+ ],
+ "metadata": {
+ "description": "VM Image Offer to use for provisioning SQL VMs"
+ },
+ "defaultValue": "SQL2016SP1-WS2016"
+ },
+ "sqlVMImageSku": {
+ "type": "string",
+ "metadata": {
+ "description": "SQL Image Sku"
+ },
+ "defaultValue": "SQLDEV"
+ },
+ "vmCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 9,
+ "metadata": {
+ "description": "Number of SQL Server VMs to be created in AlwaysOn Availability Group cluster (Min=2, Max=9)"
+ },
+ "defaultValue": 2
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023,
+ "metadata": {
+ "description": "Size of each data disk in GB on each SQL Server VM (Min=128, Max=1023)"
+ },
+ "defaultValue": 1023
+ },
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32,
+ "metadata": {
+ "description": "Number of data disks on each SQL Server VM (Min=2, Max=32). Ensure that the VM size you've selected will support this number of data disks."
+ },
+ "defaultValue": 2
+ },
+ "existingDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS domain name for existing Active Directory domain"
+ },
+ "value": "GET-PREREQ-domainName"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Administrator of the existing Active Directory Domain"
+ },
+ "value": "quickstarts"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password for the Administrator account of the existing Active Directory Domain"
+ }
+ },
+ "sqlServiceAccount": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the user account to be used for the SQL Server service account. Do not use the same account speficied in adminUsername parameter"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sqlServicePassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password to be used for the SQL Server service account"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "existingVirtualNetworkRGName": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group Name for the existing VNET."
+ },
+ "value": "GET-PREREQ-virtualNetworkResourceGroupName"
+ },
+ "existingVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the existing VNET."
+ },
+ "value": "GET-PREREQ-virtualNetworkName"
+ },
+ "existingSubnetName": {
+ "type": "string",
+ "defaultValue": "sqlSubnet",
+ "metadata": {
+ "description": "Name of the existing subnet in the existing VNET to which the SQL Server VMs should be deployed"
+ },
+ "value": "GET-PREREQ-virtualNetworkSubnetName"
+ },
+ "enableOutboundInternet": {
+ "type": "string",
+ "allowedValues": [
+ "Yes",
+ "No"
+ ],
+ "defaultValue": "No",
+ "metadata": {
+ "description": "Enable outbound Internet access via source NAT to support ongoing VM Agent extension communication needs"
+ }
+ },
+ "workloadType": {
+ "type": "string",
+ "allowedValues": [
+ "GENERAL",
+ "OLTP",
+ "DW"
+ ],
+ "metadata": {
+ "description": "SQL DB workload type: GENERAL - General workload; DW - Data Warehouse workload; OLTP - Transactional Processing workload"
+ },
+ "defaultValue": "GENERAL"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of resources that the script is dependent on such as linked templates and DSC modules"
+ },
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/sql-alwayson-md-ilb-zones/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "subnetId": "GET-PREREQ-virtualNetworkResourceGroupName/Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-virtualNetworkName/GET-PREREQ-virtualNetworkSubnetName",
+ "deploySqlClusterTemplateURL": "[uri(parameters('_artifactsLocation'),concat('nestedtemplates/deploy-sql-cluster.json', parameters('_artifactsLocationSasToken')))]",
+ "deploySqlCluster": "deploySqlCluster"
+ },
+ "resources": [
+ {
+ "name": "deploySqlCluster",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'),concat('nestedtemplates/deploy-sql-cluster.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "GET-PREREQ-location"
+ },
+ "namePrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "domainName": {
+ "value": "GET-PREREQ-domainName"
+ },
+ "adminUsername": {
+ "value": "quickstarts"
+ },
+ "adminPassword": {
+ "value": "adminPassword"
+ },
+ "sqlServiceAccount": {
+ "value": "GEN-UNIQUE"
+ },
+ "sqlServicePassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "subnetId": {
+ "value": "GET-PREREQ-virtualNetworkResourceGroupName/Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-virtualNetworkName/GET-PREREQ-virtualNetworkSubnetName"
+ },
+ "enableOutboundInternet": {
+ "value": "No"
+ },
+ "vmSize": {
+ "value": "Standard_D4s_v3"
+ },
+ "imageOffer": {
+ "value": "SQL2016SP1-WS2016"
+ },
+ "imageSKU": {
+ "value": "SQLDEV"
+ },
+ "vmCount": {
+ "value": 2
+ },
+ "vmDiskSize": {
+ "value": 1023
+ },
+ "vmDiskCount": {
+ "value": 2
+ },
+ "workloadType": {
+ "value": "GENERAL"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/sql-alwayson-md-ilb-zones/"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "agListenerName": {
+ "type": "string",
+ "value": "[reference(variables('deploySqlCluster')).outputs.agListenerName.value]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT8 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT8
new file mode 100644
index 0000000..2379324
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT8
@@ -0,0 +1,90 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/nestedtemplates/vnet.json"
+ ],
+ "timestamp": 1642962883352,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/nestedtemplates/vnet.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT8",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT8",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "Description": "The name of the Virtual Network to Create"
+ }
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string",
+ "metadata": {
+ "Description": "The address range of the new VNET in CIDR format"
+ },
+ "defaultValue": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "type": "string",
+ "metadata": {
+ "Description": "The name of the subnet created in the new VNET"
+ }
+ },
+ "subnetRange": {
+ "type": "string",
+ "metadata": {
+ "Description": "The address range of the subnet created in the new VNET"
+ },
+ "defaultValue": "10.0.0.0/24"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "virtualNetworkName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "apiVersion": "2020-03-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnetName",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT80 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT80
new file mode 100644
index 0000000..87dc858
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT80
@@ -0,0 +1,164 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-standard_ds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885586,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-standard_ds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT80",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT80",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "templateAPIVersion": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "vmUri": "scriptsUri/vm-5-datadisks.json"
+ },
+ "resources": [
+ {
+ "name": "vm-with-datadisks",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "scriptsUri/vm-5-datadisks.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "vnetID"
+ },
+ "resourceAPIVersion": {
+ "value": "resourceAPIVersion"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "scriptsUri"
+ },
+ "storageAccount": {
+ "value": "storageAccount"
+ },
+ "vmCount": {
+ "value": "vmCount"
+ },
+ "vmSpec": {
+ "value": "vmSpec"
+ },
+ "networkSpec": {
+ "value": "networkSpec"
+ },
+ "clusterSpec": {
+ "value": "clusterSpec"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT800 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT800
new file mode 100644
index 0000000..a3d1ec2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT800
@@ -0,0 +1,401 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.loganalytics/workspaces.json"
+ ],
+ "timestamp": 1642962901684,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.loganalytics/workspaces.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT800",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions",
+ "microsoft.operationalinsights/workspaces/datasources"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT800",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ },
+ "omsSolutionsName": {
+ "type": "array"
+ },
+ "tags": {
+ "type": "object"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode"
+ ],
+ "defaultValue": "Free",
+ "metadata": {
+ "description": "Service Tier: Free, Standalone, or PerNode"
+ }
+ },
+ "dataRetention": {
+ "type": "int",
+ "defaultValue": 90,
+ "minValue": 7,
+ "maxValue": 730,
+ "metadata": {
+ "description": "Number of days of retention. Free plans can only have 7 days, Standalone and OMS plans include 30 days for free"
+ }
+ },
+ "location": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "name": "[concat('oms-workspace',uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "sku": {
+ "name": "Free"
+ },
+ "retention": 90
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces/datasources",
+ "kind": "AzureActivityLog",
+ "name": "[concat(parameters('omsWorkspaceName'), '/', subscription().subscriptionId)]",
+ "apiVersion": "2020-08-01",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "linkedResourceId": "[subscriptionResourceId('microsoft.insights/eventTypes', 'management')]"
+ }
+ }
+ ],
+ "outputs": {
+ "workspaceName": {
+ "type": "string",
+ "value": "[parameters('omsWorkspaceName')]"
+ },
+ "workspaceId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('omsWorkspaceName'))]"
+ },
+ "workspaceCustomerId": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.OperationalInsights/workspaces', parameters('omsWorkspaceName')), '2020-08-01').customerId]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT801 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT801
new file mode 100644
index 0000000..2af3245
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT801
@@ -0,0 +1,220 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.network/applicationgateways.json"
+ ],
+ "timestamp": 1642962901693,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.network/applicationgateways.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT801",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/applicationgateways"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT801",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "applicationGatewaySize": {
+ "type": "string",
+ "allowedValues": [
+ "WAF_Medium",
+ "WAF_Large"
+ ],
+ "defaultValue": "WAF_Medium",
+ "metadata": {
+ "description": "application gateway size"
+ }
+ },
+ "capacity": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 10,
+ "defaultValue": 2,
+ "metadata": {
+ "description": "Number of instances"
+ }
+ },
+ "wafEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "WAF Enabled"
+ }
+ },
+ "wafMode": {
+ "type": "string",
+ "allowedValues": [
+ "Detection",
+ "Prevention"
+ ],
+ "defaultValue": "Detection",
+ "metadata": {
+ "description": "WAF Mode"
+ }
+ },
+ "wafRuleSetType": {
+ "type": "string",
+ "allowedValues": [
+ "OWASP"
+ ],
+ "defaultValue": "OWASP",
+ "metadata": {
+ "description": "WAF Rule Set Type"
+ }
+ },
+ "wafRuleSetVersion": {
+ "type": "string",
+ "allowedValues": [
+ "2.2.9",
+ "3.0"
+ ],
+ "defaultValue": "3.0",
+ "metadata": {
+ "description": "WAF Rule Set Version"
+ }
+ },
+ "applicationGatewayName": {
+ "type": "string"
+ },
+ "publicIPRef": {
+ "type": "string"
+ },
+ "frontendPorts": {
+ "type": "array"
+ },
+ "gatewayIPConfigurations": {
+ "type": "array"
+ },
+ "backendAddressPools": {
+ "type": "array"
+ },
+ "backendHttpSettingsCollection": {
+ "type": "array"
+ },
+ "httpListeners": {
+ "type": "array"
+ },
+ "requestRoutingRules": {
+ "type": "array"
+ },
+ "probes": {
+ "type": "array"
+ },
+ "omsWorkspaceResourceId": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-05-01",
+ "name": "applicationGatewayName",
+ "type": "Microsoft.Network/applicationGateways",
+ "location": "location",
+ "properties": {
+ "sku": {
+ "name": "WAF_Medium",
+ "tier": "WAF",
+ "capacity": 2
+ },
+ "gatewayIPConfigurations": "gatewayIPConfigurations",
+ "frontendIPConfigurations": [
+ {
+ "name": "appGatewayFrontendIP",
+ "properties": {
+ "PublicIPAddress": {
+ "id": "publicIPRef"
+ }
+ }
+ }
+ ],
+ "frontendPorts": "frontendPorts",
+ "backendAddressPools": "backendAddressPools",
+ "backendHttpSettingsCollection": "backendHttpSettingsCollection",
+ "httpListeners": "httpListeners",
+ "requestRoutingRules": "requestRoutingRules",
+ "webApplicationFirewallConfiguration": {
+ "enabled": true,
+ "firewallMode": "Detection",
+ "ruleSetType": "OWASP",
+ "ruleSetVersion": "3.0"
+ },
+ "probes": "probes",
+ "sslPolicy": {
+ "disabledSslProtocols": [
+ "TLSv1_0",
+ "TLSv1_1"
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "name": "Microsoft.Insights/service",
+ "apiVersion": "2017-05-01-preview",
+ "dependsOn": [
+ "applicationGatewayName"
+ ],
+ "properties": {
+ "workspaceId": "omsWorkspaceResourceId",
+ "logs": [
+ {
+ "category": "ApplicationGatewayAccessLog",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": true
+ }
+ },
+ {
+ "category": "ApplicationGatewayPerformanceLog",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": false
+ }
+ },
+ {
+ "category": "ApplicationGatewayFirewallLog",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": false
+ }
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT802 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT802
new file mode 100644
index 0000000..e277c19
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT802
@@ -0,0 +1,76 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.network/publicipaddress.json"
+ ],
+ "timestamp": 1642962901701,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.network/publicipaddress.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT802",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT802",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicIPAddressName": {
+ "type": "string"
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": "Dynamic"
+ },
+ "dnsNameForPublicIP": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIPAddressName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNameForPublicIP"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "publicIPAddressName": {
+ "type": "string",
+ "value": "[parameters('publicIPAddressName')]"
+ },
+ "publicIPRef": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/publicIPAddresses',parameters('publicIPAddressName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT803 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT803
new file mode 100644
index 0000000..01ba50e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT803
@@ -0,0 +1,73 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.network/virtualnetworks.json"
+ ],
+ "timestamp": 1642962901709,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.network/virtualnetworks.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT803",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT803",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vnetName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "addressPrefix": {
+ "type": "string"
+ },
+ "subnets": {
+ "type": "array"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-05-01",
+ "name": "vnetName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "addressPrefix"
+ ]
+ },
+ "subnets": "subnets"
+ }
+ }
+ ],
+ "outputs": {
+ "vnetId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/virtualNetworks',parameters('vnetName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT804 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT804
new file mode 100644
index 0000000..1731af6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT804
@@ -0,0 +1,56 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.auditingsettings.json"
+ ],
+ "timestamp": 1642962901717,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.auditingsettings.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT804",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers/auditingsettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT804",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "storageAccountName": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-02-02-preview",
+ "type": "Microsoft.Sql/servers/auditingSettings",
+ "name": "sqlServerName/default",
+ "properties": {
+ "state": "Enabled",
+ "storageEndpoint": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').PrimaryEndpoints.Blob]",
+ "storageAccountAccessKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').keys[0].value]",
+ "retentionDays": 0,
+ "storageAccountSubscriptionId": "[subscription().subscriptionId]",
+ "isStorageSecondaryKeyInUse": false
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT805 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT805
new file mode 100644
index 0000000..2f32ed9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT805
@@ -0,0 +1,198 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.databases.json"
+ ],
+ "timestamp": 1642962901725,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.databases.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT805",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers/databases"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT805",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "databaseName": {
+ "type": "string",
+ "defaultValue": "contosodb"
+ },
+ "location": {
+ "type": "string"
+ },
+ "edition": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "allowedValues": [
+ "Web",
+ "Business",
+ "Basic",
+ "Standard",
+ "Premium",
+ "Free",
+ "Stretch",
+ "DataWarehouse",
+ "System",
+ "System2"
+ ]
+ },
+ "tags": {
+ "type": "object"
+ },
+ "omsWorkspaceResourceId": {
+ "type": "string"
+ },
+ "administratorLogin": {
+ "type": "string"
+ },
+ "administratorLoginPassword": {
+ "type": "securestring"
+ },
+ "bacpacUri": {
+ "type": "string"
+ },
+ "bacpacUriSasToken": {
+ "type": "securestring"
+ },
+ "logsRetentionInDays": {
+ "type": "int",
+ "defaultValue": 0,
+ "minValue": 0,
+ "maxValue": 365,
+ "metadata": {
+ "description": "Specifies the number of days that logs are gonna be kept. If you do not want to apply any retention policy and retain data forever, set value to 0."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Sql/servers/databases",
+ "apiVersion": "2020-02-02-preview",
+ "name": "sqlServerName/contosodb",
+ "tags": "tags",
+ "location": "location",
+ "properties": {
+ "createMode": "Default",
+ "edition": "Basic"
+ },
+ "resources": [
+ {
+ "name": "Import",
+ "type": "extensions",
+ "apiVersion": "2014-04-01-preview",
+ "dependsOn": [
+ "Microsoft.Sql/servers/databases/sqlServerName/contosodb"
+ ],
+ "properties": {
+ "storageKey": "bacpacUriSasToken",
+ "storageKeyType": "SharedAccessKey",
+ "storageUri": "bacpacUri",
+ "administratorLogin": "administratorLogin",
+ "administratorLoginPassword": "administratorLoginPassword",
+ "operationMode": "Import"
+ }
+ },
+ {
+ "type": "providers/diagnosticSettings",
+ "name": "Microsoft.Insights/service",
+ "dependsOn": [
+ "Microsoft.Sql/servers/databases/sqlServerName/contosodb"
+ ],
+ "apiVersion": "2017-05-01-preview",
+ "properties": {
+ "workspaceId": "omsWorkspaceResourceId",
+ "logs": [
+ {
+ "category": "QueryStoreRuntimeStatistics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "QueryStoreWaitStatistics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "Errors",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "DatabaseWaitStatistics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "Timeouts",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "Blocks",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "SQLInsights",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ }
+ ],
+ "metrics": [
+ {
+ "timeGrain": "AllMetrics",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": true,
+ "days": 0
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT806 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT806
new file mode 100644
index 0000000..8753dd7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT806
@@ -0,0 +1,62 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.securityalertpolicies.json"
+ ],
+ "timestamp": 1642962901737,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.securityalertpolicies.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT806",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers/securityalertpolicies"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT806",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "storageAccountName": {
+ "type": "string"
+ },
+ "sendAlertsTo": {
+ "type": "string",
+ "defaultValue": "dummy@contoso.com",
+ "metadata": {
+ "description": "Specifies the semicolon-separated list of e-mail addresses to which the alert is sent."
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-02-02-preview",
+ "type": "Microsoft.Sql/servers/securityAlertPolicies",
+ "name": "sqlServerName/default",
+ "properties": {
+ "state": "Enabled",
+ "emailAddresses": "[split(parameters('sendAlertsTo'),';')]",
+ "storageEndpoint": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').PrimaryEndpoints.Blob]",
+ "storageAccountAccessKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').keys[0].value]",
+ "retentionDays": 0
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT807 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT807
new file mode 100644
index 0000000..e17bc25
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT807
@@ -0,0 +1,89 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.v12.0.json"
+ ],
+ "timestamp": 1642962901747,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.sql/servers.v12.0.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT807",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT807",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "administratorLogin": {
+ "type": "string"
+ },
+ "administratorLoginPassword": {
+ "type": "securestring"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "name": "sqlServerName",
+ "type": "Microsoft.Sql/servers",
+ "apiVersion": "2020-02-02-preview",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "administratorLogin": "administratorLogin",
+ "administratorLoginPassword": "administratorLoginPassword",
+ "version": "12.0"
+ },
+ "resources": [
+ {
+ "name": "AllowAllWindowsAzureIps",
+ "type": "firewallRules",
+ "location": "location",
+ "apiVersion": "2020-02-02-preview",
+ "dependsOn": [
+ "Microsoft.Sql/servers/sqlServerName"
+ ],
+ "properties": {
+ "startIpAddress": "0.0.0.0",
+ "endIpAddress": "0.0.0.0"
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "name": {
+ "type": "string",
+ "value": "[parameters('sqlServerName')]"
+ },
+ "fqdn": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Sql/servers', parameters('sqlServerName')),'2020-02-02-preview').fullyQualifiedDomainName]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT808 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT808
new file mode 100644
index 0000000..17205e7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT808
@@ -0,0 +1,89 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.storage/storageaccounts.storage.json"
+ ],
+ "timestamp": 1642962901756,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.storage/storageaccounts.storage.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT808",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT808",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountName": {
+ "defaultValue": "qwerty",
+ "type": "string"
+ },
+ "sku": {
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_GRS",
+ "Standard_RAGRS",
+ "Standard_ZRS",
+ "Premium_LRS"
+ ],
+ "defaultValue": "Standard_LRS",
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2021-01-01",
+ "name": "qwerty",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "encryption": {
+ "services": {
+ "blob": {
+ "enabled": true
+ },
+ "file": {
+ "enabled": true
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ },
+ "supportsHttpsTrafficOnly": true
+ }
+ }
+ ],
+ "outputs": {
+ "storageAccountName": {
+ "type": "string",
+ "value": "[parameters('storageAccountName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT809 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT809
new file mode 100644
index 0000000..26edb8e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT809
@@ -0,0 +1,89 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/serverfarms.json"
+ ],
+ "timestamp": 1642962901764,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/serverfarms.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT809",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT809",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "name": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Free"
+ },
+ "skuCode": {
+ "type": "string",
+ "defaultValue": "F1"
+ },
+ "workerSize": {
+ "type": "int",
+ "defaultValue": 0
+ },
+ "workerSizeId": {
+ "type": "int",
+ "defaultValue": 0
+ },
+ "numberOfWorkers": {
+ "type": "int",
+ "defaultValue": 1
+ },
+ "hostingEnvironment": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/serverfarms",
+ "name": "name",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "name": "name",
+ "workerSize": 0,
+ "workerSizeId": 0,
+ "numberOfWorkers": 1,
+ "reserved": false,
+ "hostingEnvironment": ""
+ },
+ "sku": {
+ "Tier": "Free",
+ "Name": "F1"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT81 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT81
new file mode 100644
index 0000000..b154fe8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT81
@@ -0,0 +1,164 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-standard_ds14.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885682,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/data-node-standard_ds14.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT81",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT81",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "templateAPIVersion": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "vmUri": "scriptsUri/vm-10-datadisks.json"
+ },
+ "resources": [
+ {
+ "name": "vm-with-datadisks",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "scriptsUri/vm-10-datadisks.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "vnetID"
+ },
+ "resourceAPIVersion": {
+ "value": "resourceAPIVersion"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "scriptsUri"
+ },
+ "storageAccount": {
+ "value": "storageAccount"
+ },
+ "vmCount": {
+ "value": "vmCount"
+ },
+ "vmSpec": {
+ "value": "vmSpec"
+ },
+ "networkSpec": {
+ "value": "networkSpec"
+ },
+ "clusterSpec": {
+ "value": "clusterSpec"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT810 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT810
new file mode 100644
index 0000000..84b64f7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT810
@@ -0,0 +1,75 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/sites.config.connectionstrings.json"
+ ],
+ "timestamp": 1642962901775,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/sites.config.connectionstrings.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT810",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites/config"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT810",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "webAppName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "connectionType": {
+ "type": "string",
+ "defaultValue": "Custom",
+ "allowedValues": [
+ "MySql",
+ "SQLServer",
+ "SQLAzure",
+ "Custom",
+ "NotificationHub",
+ "ServiceBus",
+ "EventHub",
+ "ApiHub",
+ "DocDb",
+ "RedisCache",
+ "PostgreSQL"
+ ]
+ },
+ "connectionString": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "name": "webAppName/connectionstrings",
+ "apiVersion": "2018-02-01",
+ "type": "Microsoft.Web/sites/config",
+ "location": "location",
+ "properties": {
+ "DefaultConnection": {
+ "value": "connectionString",
+ "type": "Custom"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT811 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT811
new file mode 100644
index 0000000..9223baf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT811
@@ -0,0 +1,59 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/sites.extensions.msdeploy.json"
+ ],
+ "timestamp": 1642962901782,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/sites.extensions.msdeploy.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT811",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT811",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "webAppName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "packageUri": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "name": "webAppName/MSDeploy",
+ "type": "Microsoft.Web/sites/extensions",
+ "location": "location",
+ "apiVersion": "2018-02-01",
+ "tags": "tags",
+ "properties": {
+ "packageUri": "packageUri"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT812 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT812
new file mode 100644
index 0000000..523794b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT812
@@ -0,0 +1,84 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/sites.json"
+ ],
+ "timestamp": 1642962901787,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/sql-injection-attack-prevention/nested/microsoft.web/sites.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT812",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT812",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "name": {
+ "type": "string"
+ },
+ "hostingPlanName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "hostingEnvironment": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "variables": {
+ "tags": {
+ "[concat('hidden-related:', resourceId('Microsoft.Web/serverfarms',parameters('hostingPlanName')))]": "empty"
+ },
+ "combinedTags": "[union(parameters('tags'),variables('tags'))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "type": "Microsoft.Web/sites",
+ "name": "name",
+ "location": "location",
+ "tags": "[union(parameters('tags'),variables('tags'))]",
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "properties": {
+ "name": "name",
+ "serverFarmId": "Microsoft.Web/serverfarms/hostingPlanName",
+ "hostingEnvironment": ""
+ }
+ }
+ ],
+ "outputs": {
+ "principalId": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Web/sites', parameters('name')), '2019-08-01', 'Full').identity.principalId]"
+ },
+ "endpoint": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Web/sites', parameters('name'))).defaultHostName]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT814 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT814
new file mode 100644
index 0000000..8fd2038
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT814
@@ -0,0 +1,303 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-import-zipped-vhds/prereqs/prereq.azuredeploy.json",
+ "/demos/storage-import-zipped-vhds/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901817,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-import-zipped-vhds/prereqs/prereq.azuredeploy.json",
+ "/demos/storage-import-zipped-vhds/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT814",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.authorization/roleassignments",
+ "microsoft.keyvault/vaults/secrets",
+ "microsoft.resources/deploymentscripts",
+ "microsoft.keyvault/vaults",
+ "microsoft.storage/storageaccounts",
+ "microsoft.managedidentity/userassignedidentities"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT814",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.210606",
+ "parameters": {
+ "locationSource": {
+ "type": "string",
+ "metadata": {
+ "description": "The Azure Region location in which the source resources should be deployed. E.g. westus (Azure Public)"
+ },
+ "defaultValue": "[parameters('location')]"
+ },
+ "storageAccountNameSource": {
+ "type": "string",
+ "defaultValue": "[concat('source', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of Storage Account."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "blobContainerNameSource": {
+ "type": "string",
+ "defaultValue": "vhd",
+ "metadata": {
+ "description": "Name of the Blob Container"
+ }
+ },
+ "locationDestination": {
+ "type": "string",
+ "metadata": {
+ "description": "The Azure Region location in which the source resources should be deployed. E.g. francecentral (Azure Public)"
+ },
+ "defaultValue": "[parameters('location')]"
+ },
+ "storageAccountNameDestination": {
+ "type": "string",
+ "defaultValue": "[concat('destination', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of Storage Account."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "blobContainerNameDestination": {
+ "type": "string",
+ "defaultValue": "vhd",
+ "metadata": {
+ "description": "Name of the Blob Container"
+ }
+ },
+ "storageAccountKind": {
+ "type": "string",
+ "defaultValue": "StorageV2"
+ },
+ "storageAccountSkuName": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Premium_LRS",
+ "Standard_ZRS",
+ "Standard_GRS"
+ ],
+ "metadata": {
+ "description": "Storage Account SKU"
+ }
+ },
+ "forceUpdateTag": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "forceUpdateTag property, used to force the execution of the script resource when no other properties have changed."
+ }
+ },
+ "keyVaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the key vault."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "tenantId": {
+ "type": "string",
+ "defaultValue": "[subscription().tenantId]",
+ "metadata": {
+ "description": "Specifies the Azure Active Directory tenant ID that should be used for authenticating requests to the key vault. Get it by using Get-AzSubscription cmdlet."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "The Azure Region location in which the source resources should be deployed. E.g. westus (Azure Public)"
+ },
+ "defaultValue": "[resourceGroup().location]"
+ }
+ },
+ "variables": {
+ "userAssignedIdentityName": "[concat('ImportVHD-FromZipArchive-Prereq-worker-',uniqueString(resourceGroup().id))]",
+ "roleAssignmentName": "[guid(concat(variables('userAssignedIdentityName'),resourceGroup().id, 'contributor'))]",
+ "deploymentScriptNameCreateSource": "CreateVHDZipArchiveUrl",
+ "forceUpdateTag": "[newGuid()]",
+ "listAccountSasRequestContent": {
+ "signedServices": "bfqt",
+ "signedPermission": "rwdlacup",
+ "signedStart": "2021-06-02T00:00:00Z",
+ "signedExpiry": "2030-10-30T00:00:00Z",
+ "signedResourceTypes": "sco"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-02-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "location": "[parameters('location')]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "resources": [
+ {
+ "name": "default/vhd",
+ "type": "blobServices/containers",
+ "apiVersion": "2021-02-01",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ ],
+ "properties": {
+ "publicAccess": "Blob"
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[variables('userAssignedIdentityName')]",
+ "location": "[parameters('location')]"
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2018-09-01-preview",
+ "name": "[guid(concat(variables('userAssignedIdentityName'),resourceGroup().id, 'contributor'))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]"
+ ],
+ "properties": {
+ "roleDefinitionId": "Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
+ "scope": "[resourceGroup().id]",
+ "principalType": "ServicePrincipal"
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deploymentScripts",
+ "apiVersion": "2020-10-01",
+ "name": "CreateVHDZipArchiveUrl",
+ "location": "[parameters('location')]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ ],
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
+ }
+ },
+ "kind": "AzurePowerShell",
+ "properties": {
+ "azPowerShellVersion": "5.5",
+ "cleanupPreference": "OnSuccess",
+ "environmentVariables": [
+ {
+ "name": "ResourceGroupName",
+ "value": "[resourceGroup().name]"
+ },
+ {
+ "name": "StorageAccountName",
+ "value": "GEN-UNIQUE"
+ },
+ {
+ "name": "BlobContainerName",
+ "value": "vhd"
+ }
+ ],
+ "forceUpdateTag": "[newGuid()]",
+ "retentionInterval": "PT2H",
+ "scriptContent": "# 210602 \n \n ##### Parameters \n \n $StorageAccountName = ${Env:StorageAccountName} \n $BlobContainerName = ${Env:BlobContainerName} \n $ResourceGroupName = ${Env:ResourceGroupName} \n \n ##### Variables \n \n $StartTime = Get-Date \n $EndTime = $startTime.AddHours(2.0) \n \n ##### Create a VHD archive zip \n \n $timestamp = (Get-Date -Format 'yyMMddhhmmss') \n $vhdZipArchive = 'fake-vhd-disk-archive-{0}.zip' -f $timestamp \n \n New-Item -Force -Type File -Name ('fake-vhd-disk1-{0}.vhd' -f $timestamp) \n New-Item -Force -Type File -Name ('fake-vhd-disk2-{0}.vhd' -f $timestamp) \n New-Item -Force -Type File -Name ('fake-vhd-disk3-{0}.vhd' -f $timestamp) \n New-Item -Force -Type File -Name ('fake-readme-{0}.md' -f $timestamp) \n \n Compress-Archive -Force -Path 'fake*' -DestinationPath $vhdZipArchive \n \n ##### Storage account \n \n $StorageAccount = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName \n $Blob = Set-AzStorageBlobContent -File $vhdZipArchive -Container $BlobContainerName -blob $vhdZipArchive -context $StorageAccount.Context \n $urlVHDZipArchive = New-AzStorageBlobSASToken -FullUri -Context $StorageAccount.Context -Container $BlobContainerName -Blob $vhdZipArchive -Permission r -StartTime $StartTime -ExpiryTime $EndTime \n \n ##### Output \n $DeploymentScriptOutputs = @{} \n $DeploymentScriptOutputs['urlVHDZipArchive'] = $urlVHDZipArchive \n "
+ }
+ },
+ {
+ "apiVersion": "2021-02-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "location": "[parameters('location')]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "resources": [
+ {
+ "name": "default/vhd",
+ "type": "blobServices/containers",
+ "apiVersion": "2021-02-01",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ ],
+ "properties": {
+ "publicAccess": "Blob"
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults",
+ "apiVersion": "2019-09-01",
+ "name": "GEN-UNIQUE",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ ],
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "enabledForDeployment": true,
+ "enabledForDiskEncryption": false,
+ "enabledForTemplateDeployment": true,
+ "tenantId": "[subscription().tenantId]",
+ "accessPolicies": [],
+ "sku": {
+ "name": "Standard",
+ "family": "A"
+ },
+ "networkAcls": {
+ "defaultAction": "Allow",
+ "bypass": "AzureServices"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults/secrets",
+ "apiVersion": "2019-09-01",
+ "name": "GEN-UNIQUE/Source",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "[reference(variables('deploymentScriptNameCreateSource')).outputs.urlVHDZipArchive]"
+ }
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults/secrets",
+ "apiVersion": "2019-09-01",
+ "name": "GEN-UNIQUE/Destination",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "[concat(reference(parameters('storageAccountNameDestination')).primaryEndpoints.blob, parameters('blobContainerNameDestination'), '?', listAccountSas(parameters('storageAccountNameDestination'), '2021-04-01', variables('listAccountSasRequestContent')).accountSasToken)]"
+ }
+ }
+ ],
+ "outputs": {
+ "KeyVaultId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT815 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT815
new file mode 100644
index 0000000..e8ff6fc
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT815
@@ -0,0 +1,138 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-import-zipped-vhds/azuredeploy.json",
+ "/demos/storage-import-zipped-vhds/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901826,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-import-zipped-vhds/azuredeploy.json",
+ "/demos/storage-import-zipped-vhds/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT815",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.authorization/roleassignments",
+ "microsoft.managedidentity/userassignedidentities",
+ "microsoft.resources/deploymentscripts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT815",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.210607",
+ "parameters": {
+ "Source": {
+ "type": "securestring",
+ "metadata": {
+ "description": "URL of a ZIP archive containing VHD images files. For example: https://provider.com/bin/support/azure-vhd.zip"
+ }
+ },
+ "Destination": {
+ "type": "securestring",
+ "metadata": {
+ "description": "URI of a Storage Account container with a writable SAS Token."
+ }
+ },
+ "forceUpdateTag": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "Used to force the execution when redeploying the template with the same parameters. Default: [newGuid()]"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The location in which the resources should be deployed. Default: [resourceGroup().location]"
+ }
+ }
+ },
+ "variables": {
+ "urlVHDZipArchive": "Source",
+ "uriWritableStorageAccountBlobContainerSasToken": "Destination",
+ "deploymentScriptName": "[concat('ImportVHD-FromZipArchive-',uniqueString(parameters('Source'),uniqueString(parameters('Destination'))))]",
+ "userAssignedIdentityName": "[concat('ImportVHD-FromZipArchiveURL-worker-',uniqueString(resourceGroup().id))]",
+ "roleAssignmentName": "[guid(concat(variables('userAssignedIdentityName'),resourceGroup().id, 'contributor'))]",
+ "forceUpdateTag": "[newGuid()]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[variables('userAssignedIdentityName')]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2018-09-01-preview",
+ "name": "[guid(concat(variables('userAssignedIdentityName'),resourceGroup().id, 'contributor'))]",
+ "dependsOn": [
+ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]"
+ ],
+ "properties": {
+ "roleDefinitionId": "Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
+ "scope": "[resourceGroup().id]",
+ "principalType": "ServicePrincipal"
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deploymentScripts",
+ "apiVersion": "2020-10-01",
+ "name": "[variables('deploymentScriptName')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Authorization/roleAssignments/[guid(concat(variables('userAssignedIdentityName'),resourceGroup().id, 'contributor'))]"
+ ],
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
+ }
+ },
+ "kind": "AzurePowerShell",
+ "properties": {
+ "azPowerShellVersion": "5.5",
+ "cleanupPreference": "OnSuccess",
+ "environmentVariables": [
+ {
+ "name": "ResourceGroupName",
+ "value": "[resourceGroup().name]"
+ },
+ {
+ "name": "Source",
+ "secureValue": "Source"
+ },
+ {
+ "name": "Destination",
+ "secureValue": "Destination"
+ }
+ ],
+ "forceUpdateTag": "[newGuid()]",
+ "retentionInterval": "PT4H",
+ "scriptContent": "# 210602 \n \n ##### Parameters \n \n $urlVHDZipArchive = ${Env:Source} \n $uriWritableStorageAccountBlobContainerSasToken = ${Env:Destination} \n $ResourceGroupName = ${Env:ResourceGroupName} \n \n ##### Validate Parameters \n \n if (! ([System.Uri]::IsWellFormedUriString($urlVHDZipArchive,[System.UriKind]::Absolute))) { \n Throw 'The Source URL parameter is probably not well formatted. Please check and retry.' \n } \n \n if (! ([System.Uri]::IsWellFormedUriString($uriWritableStorageAccountBlobContainerSasToken,[System.UriKind]::Absolute))) { \n Throw 'The Destination URI parameter is probably not well formatted. The URI of a Storage Account Container with a SAS Token is expected. Please check and retry.' \n } \n \n ##### Variables \n \n $base_path='/mnt/azscripts' \n $temp_path='{0}/temp' -f $base_path \n New-Item -Type Directory -ErrorAction SilentlyContinue $temp_path \n \n $timestamp = Get-Date -Format 'yyMMddHHmmss' \n \n ##### Prereqs \n \n Write-Output 'Increase file share quota to 4TB instead of 2GB before downloading and expanding' \n $QuotaGiB = '4096' \n Get-AzStorageAccount -ResourceGroupName $ResourceGroupName | Where-Object { $_.StorageAccountName -like '*azscripts' } | ForEach-Object { \n $StorageAccount = $_ \n Get-AzStorageShare -Context $StorageAccount.Context | ForEach-Object { \n $Share = $_ \n Set-AzStorageShareQuota -ShareName $Share.Name -Context $StorageAccount.Context -Quota $QuotaGiB \n } \n } \n \n ##### Fetch and process \n \n Write-Output 'Download the ZIP archive' \n $archive_path='{0}/archive-{1}.zip' -f $temp_path,$timestamp \n # Accelerate file download (initially using Invoke-WebRequest) \n (New-Object System.Net.WebClient).DownloadFile($urlVHDZipArchive, $archive_path) \n \n Write-Output 'Expand locally' \n $expanded_archive_path ='{0}/expanded-{1}' -f $temp_path,$timestamp \n New-Item -Type Directory -ErrorAction SilentlyContinue $expanded_archive_path \n Expand-Archive -Path $archive_path -DestinationPath $expanded_archive_path -Force \n \n ##### Upload to Azure Storage account \n \n Write-Output 'Upload extracted VHD file(s)' \n \n $DeploymentScriptOutputs = @{} \n $DeploymentScriptOutputs['vhdBlobUriList'] = @{} \n $DeploymentScriptOutputs['vhdBlobSHA256List'] = @{} \n \n $StorageAccountContainerUri = ($uriWritableStorageAccountBlobContainerSasToken -split [Regex]::Escape('?'))[0] \n $StorageAccountName = (([System.Uri]$uriWritableStorageAccountBlobContainerSasToken).Host -split [Regex]::Escape('.'))[0] \n $ContainerName = ($StorageAccountContainerUri -split '/')[-1] # Last element \n $StorageAccountContainerSASToken = ($uriWritableStorageAccountBlobContainerSasToken -split [Regex]::Escape('?'))[1] \n $StorageAccountContext = New-AzStorageContext -StorageAccountName $StorageAccountName -SasToken $StorageAccountContainerSASToken \n \n $vhd_filepath='{0}/*.vhd' -f $expanded_archive_path \n \n Get-Item $vhd_filepath | ForEach-Object { \n $localFilePath = $_ \n $vhdBlobName = $localFilePath.Name \n $vhdBlobUri = '{0}/{1}' -f $StorageAccountContainerUri,$vhdBlobName \n \n $hash = (Get-FileHash -Algorithm SHA256 -Path $localFilePath).Hash \n $metadata = @{'SHA256' = $hash; } \n \n Write-Output 'Uploading ' + $vhdBlobName \n Set-AzStorageBlobContent -File $localFilePath -Context $StorageAccountContext -Container $ContainerName -Blob $vhdBlobName -BlobType Page -Metadata $metadata -Force \n $DeploymentScriptOutputs['vhdBlobUriList'][$vhdBlobName] = $vhdBlobUri \n $DeploymentScriptOutputs['vhdBlobSHA256List'][$vhdBlobName] = $hash \n } \n "
+ }
+ }
+ ],
+ "outputs": {
+ "vhdBlobUriList": {
+ "type": "object",
+ "value": "[reference(variables('deploymentScriptName')).outputs.vhdBlobUriList]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT816 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT816
new file mode 100644
index 0000000..2295f58
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT816
@@ -0,0 +1,365 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-iops-latency-throughput-demo/azuredeploy.json",
+ "/demos/storage-iops-latency-throughput-demo/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901845,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-iops-latency-throughput-demo/azuredeploy.json",
+ "/demos/storage-iops-latency-throughput-demo/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT816",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT816",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmAdminUserName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The administrative user on the Windows VM."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmAdminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The administrative user password."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vNetName": {
+ "type": "string",
+ "defaultValue": "demo-vnet",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the virtual network resource"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "vmPIPDnsName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The DNS prefix assigned to the public IP address resource."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_D2s_v3"
+ ],
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "VM Size"
+ }
+ }
+ },
+ "variables": {
+ "vNetPrefix": "10.0.0.0/16",
+ "vNetSubnet1Name": "subnet-01",
+ "vNetSubnet1Prefix": "10.0.0.0/24",
+ "storageAccountType": [
+ "Premium_LRS",
+ "Standard_LRS"
+ ],
+ "storageAccountNamePrefix": [
+ "premium",
+ "standard"
+ ],
+ "vmImagePublisher": "MicrosoftWindowsServer",
+ "vm1ImageOffer": "WindowsServer",
+ "vmName": "demo-01",
+ "vmWindowsOSVersion": "2019-Datacenter",
+ "vmNicName": "demo-01-nic-0",
+ "vmPIPName": "demo-01-PIP",
+ "networkSecurityGroupName": "default-NSG",
+ "dscConfigureVM": {
+ "scriptFileUri": "[uri(parameters('_artifactsLocation'), concat('dsc/vmDemo.zip', parameters('_artifactsLocationSasToken')))]",
+ "script": "vmDemo.ps1",
+ "function": "vmDemo"
+ }
+ },
+ "resources": [
+ {
+ "name": "[concat(variables('storageAccountNamePrefix')[copyIndex()],uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.Storage/storageAccounts",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-01-01",
+ "tags": {
+ "displayName": "[concat(variables('storageAccountNamePrefix')[copyIndex()],uniqueString(resourceGroup().id))]"
+ },
+ "sku": {
+ "name": "(storageAccountType)[copyIndex()]"
+ }
+ },
+ {
+ "name": "[concat(variables('storageAccountNamePrefix')[copyIndex()],uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.Storage/storageAccounts",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-01-01",
+ "tags": {
+ "displayName": "[concat(variables('storageAccountNamePrefix')[copyIndex()],uniqueString(resourceGroup().id))]"
+ },
+ "sku": {
+ "name": "(storageAccountType)[copyIndex()]"
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-08-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "GEN-VNET-NAME",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-08-01",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "tags": {
+ "displayName": "GEN-VNET-NAME"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnet-01",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "demo-01-nic-0",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-08-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-VNET-NAME",
+ "Microsoft.Network/publicIPAddresses/demo-01-PIP"
+ ],
+ "tags": {
+ "displayName": "demo-01-nic-0"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//GEN-VNET-NAME/subnet-01"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/demo-01-PIP"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "demo-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "storageAccountCopy",
+ "Microsoft.Network/networkInterfaces/demo-01-nic-0"
+ ],
+ "tags": {
+ "displayName": "demo-01"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "demo-01",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "demo-01_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "demo-01_DataDisk1",
+ "lun": 0,
+ "diskSizeGB": 100,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "demo-01_DataDisk2",
+ "lun": 1,
+ "diskSizeGB": 100,
+ "caching": "ReadOnly",
+ "createOption": "Empty"
+ },
+ {
+ "name": "demo-01_DataDisk3",
+ "lun": 2,
+ "diskSizeGB": 100,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "demo-01_DataDisk4",
+ "lun": 3,
+ "diskSizeGB": 1023,
+ "caching": "None",
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/demo-01-nic-0"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "DSC",
+ "type": "extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//demo-01"
+ ],
+ "tags": {
+ "displayName": "demo-01/DSC"
+ },
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.9",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "configuration": {
+ "configuration": {
+ "url": "(dscConfigureVM).scriptFileUri",
+ "script": "(dscConfigureVM).script",
+ "function": "(dscConfigureVM).function"
+ },
+ "configurationArguments": {
+ "nodeName": "demo-01"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "demo-01-PIP",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-08-01",
+ "tags": {
+ "displayName": "demo-01-PIP"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vmURI": {
+ "type": "string",
+ "value": "[reference(variables('vmPIPName')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT817 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT817
new file mode 100644
index 0000000..6d3e3e3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT817
@@ -0,0 +1,386 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct/nestedtemplates/deploy-s2d-cluster.json"
+ ],
+ "timestamp": 1642962901856,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct/nestedtemplates/deploy-s2d-cluster.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT817",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT817",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "namePrefix": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 8,
+ "metadata": {
+ "description": "Naming prefix for each new resource created. 3-char min, 8-char max, lowercase alphanumeric"
+ }
+ },
+ "domainName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS domain name for existing Active Directory domain"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Administrator of the existing Active Directory Domain"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password for the Administrator account of the existing Active Directory Domain"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_GRS",
+ "Standard_RAGRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "Type of new Storage Accounts (Standard_LRS, Standard_GRS, Standard_RAGRS or Premium_LRS) to be created to store VM disks"
+ }
+ },
+ "nicSubnetUri": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource ID for existing vnet/subnet to which VM NICs should be attached"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Size of the S2D VMs to be created"
+ }
+ },
+ "vmCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 3,
+ "metadata": {
+ "description": "Number of S2D VMs to be created in cluster (Min=2, Max=3)"
+ }
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023,
+ "metadata": {
+ "description": "Size of each data disk in GB on each S2D VM (Min=128, Max=1023)"
+ }
+ },
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32,
+ "metadata": {
+ "description": "Number of data disks on each S2D VM (Min=2, Max=32). Ensure that the VM size you've selected will support this number of data disks."
+ }
+ },
+ "sofsName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of clustered Scale-Out File Server role"
+ }
+ },
+ "shareName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of shared data folder on clustered Scale-Out File Server role"
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer"
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer"
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2019-Datacenter"
+ },
+ "imageVersion": {
+ "type": "string",
+ "defaultValue": "latest"
+ },
+ "_artifactsLocation": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "apiVersionStorage": "2016-01-01",
+ "storageNamePrefix": "[concat(parameters('namePrefix'),uniqueString(resourceGroup().id),'vm')]",
+ "witnessStorageName": "[concat(parameters('namePrefix'),uniqueString(resourceGroup().id),'cw')]",
+ "witnessStorageType": "Standard_LRS",
+ "vmNamePrefix": "namePrefix-s2d-",
+ "vmAvailabilitySetName": "namePrefix-s2d-as",
+ "clusterName": "namePrefix-s2d-c",
+ "vmLoopTemplateURL": "_artifactsLocation/nestedtemplates/newVM.json_artifactsLocationSasToken",
+ "s2dPrepModulesURL": "_artifactsLocation/dsc/prep-s2d.ps1.zip_artifactsLocationSasToken",
+ "s2dPrepFunction": "PrepS2D.ps1\\PrepS2D",
+ "s2dConfigModulesURL": "_artifactsLocation/dsc/config-s2d.ps1.zip_artifactsLocationSasToken",
+ "s2dConfigFunction": "ConfigS2D.ps1\\ConfigS2D"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "namePrefix-s2d-as",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "PlatformUpdateDomainCount": 3,
+ "PlatformFaultDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('witnessStorageName')]",
+ "apiVersion": "2016-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[concat(variables('storageNamePrefix'),copyindex())]",
+ "apiVersion": "2016-01-01",
+ "copy": {
+ "name": "storageAccountLoop",
+ "count": "vmCount"
+ },
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "storageAccountType"
+ },
+ "kind": "Storage"
+ },
+ {
+ "name": "namePrefix-s2d-copyindex()-nic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "copy": {
+ "name": "nicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "nicSubnetUri"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": "vmCount"
+ },
+ "name": "namePrefix-s2d-copyindex()-newVM",
+ "dependsOn": [
+ "storageAccountLoop",
+ "nicLoop",
+ "Microsoft.Compute/availabilitySets/namePrefix-s2d-as"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "_artifactsLocation/nestedtemplates/newVM.json_artifactsLocationSasToken"
+ },
+ "parameters": {
+ "vmName": {
+ "value": "namePrefix-s2d-copyindex()"
+ },
+ "storageAccountUri": {
+ "value": "[reference(concat('Microsoft.Storage/storageAccounts/',variables('StorageNamePrefix'),copyIndex()),variables('apiVersionStorage')).primaryEndpoints.blob]"
+ },
+ "vmAvailabilitySetName": {
+ "value": "namePrefix-s2d-as"
+ },
+ "vmSize": {
+ "value": "vmSize"
+ },
+ "vmDiskCount": {
+ "value": "vmDiskCount"
+ },
+ "vmDiskSize": {
+ "value": "vmDiskSize"
+ },
+ "adminUsername": {
+ "value": "adminUsername"
+ },
+ "adminPassword": {
+ "value": "adminPassword"
+ },
+ "_artifactsLocation": {
+ "value": "_artifactsLocation"
+ },
+ "_artifactsLocationSasToken": {
+ "value": "_artifactsLocationSasToken"
+ },
+ "imagePublisher": {
+ "value": "MicrosoftWindowsServer"
+ },
+ "imageOffer": {
+ "value": "WindowsServer"
+ },
+ "imageSKU": {
+ "value": "2019-Datacenter"
+ },
+ "imageVersion": {
+ "value": "latest"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmNamePrefix'),copyindex(1),'/s2dPrep')]",
+ "apiVersion": "2015-06-15",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "virtualMachineLoop"
+ ],
+ "copy": {
+ "name": "virtualMachineExtensionLoop",
+ "count": "[sub(parameters('vmCount'),1)]"
+ },
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.20",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "_artifactsLocation/dsc/prep-s2d.ps1.zip_artifactsLocationSasToken",
+ "configurationFunction": "PrepS2D.ps1\\PrepS2D",
+ "properties": {
+ "domainName": "domainName",
+ "adminCreds": {
+ "userName": "adminUsername",
+ "password": "PrivateSettingsRef:adminPassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "items": {
+ "adminPassword": "adminPassword"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namePrefix-s2d-0/s2dConfig",
+ "apiVersion": "2015-06-15",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "virtualMachineLoop",
+ "virtualMachineExtensionLoop",
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('witnessStorageName'))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.20",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "_artifactsLocation/dsc/config-s2d.ps1.zip_artifactsLocationSasToken",
+ "configurationFunction": "ConfigS2D.ps1\\ConfigS2D",
+ "properties": {
+ "domainName": "domainName",
+ "clusterName": "namePrefix-s2d-c",
+ "sofsName": "sofsName",
+ "shareName": "shareName",
+ "vmNamePrefix": "namePrefix-s2d-",
+ "vmCount": "vmCount",
+ "vmDiskSize": "vmDiskSize",
+ "witnessStorageName": "[variables('witnessStorageName')]",
+ "witnessStorageEndpoint": "[replace(split(reference(concat('Microsoft.Storage/storageAccounts/', variables('witnessStorageName'))).primaryEndpoints.blob, 'blob.')[1], '/', '')]",
+ "witnessStorageKey": {
+ "userName": "PLACEHOLDER-DO-NOT-USE",
+ "password": "PrivateSettingsRef:witnessStorageKey"
+ },
+ "adminCreds": {
+ "userName": "adminUsername",
+ "password": "PrivateSettingsRef:adminPassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "items": {
+ "adminPassword": "adminPassword",
+ "witnessStorageKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts',variables('witnessStorageName')),variables('apiVersionStorage')).keys[0].value]"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "sofsName": {
+ "type": "string",
+ "value": "[parameters('sofsName')]"
+ },
+ "shareName": {
+ "type": "string",
+ "value": "[parameters('shareName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT818 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT818
new file mode 100644
index 0000000..516a8ba
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT818
@@ -0,0 +1,293 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct/nestedtemplates/diskSelection.json"
+ ],
+ "timestamp": 1642962901884,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct/nestedtemplates/diskSelection.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT818",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": []
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT818",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023
+ },
+ "diskCaching": {
+ "type": "string",
+ "allowedValues": [
+ "None",
+ "ReadOnly",
+ "ReadWrite"
+ ],
+ "defaultValue": "None"
+ },
+ "storageAccountUri": {
+ "type": "string"
+ },
+ "diskNamingPrefix": {
+ "type": "string"
+ }
+ },
+ "variables": {
+ "diskArray": [
+ {
+ "name": "diskNamingPrefixdisk0",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 0,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk1",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 1,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk2",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 2,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk3",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 3,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk4",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 4,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk5",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 5,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk6",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 6,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk7",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 7,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk8",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 8,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk9",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 9,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk10",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 10,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk11",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 11,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk12",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 12,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk13",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 13,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk14",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 14,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk15",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 15,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk16",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 16,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk17",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 17,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk18",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 18,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk19",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 19,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk20",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 20,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk21",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 21,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk22",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 22,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk23",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 23,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk24",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 24,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk25",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 25,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk26",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 26,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk27",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 27,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk28",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 28,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk29",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 29,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk30",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 30,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk31",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 31,
+ "caching": "None",
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "resources": [],
+ "outputs": {
+ "dataDiskArray": {
+ "type": "array",
+ "value": "[take(variables('diskArray'),parameters('vmDiskCount'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT819 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT819
new file mode 100644
index 0000000..b84a524
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT819
@@ -0,0 +1,167 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct/nestedtemplates/newVM.json"
+ ],
+ "timestamp": 1642962901894,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct/nestedtemplates/newVM.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT819",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT819",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "type": "string"
+ },
+ "storageAccountUri": {
+ "type": "string"
+ },
+ "vmAvailabilitySetName": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmDiskCount": {
+ "type": "int"
+ },
+ "vmDiskSize": {
+ "type": "int"
+ },
+ "adminUsername": {
+ "type": "string"
+ },
+ "adminPassword": {
+ "type": "securestring"
+ },
+ "imagePublisher": {
+ "type": "string"
+ },
+ "imageOffer": {
+ "type": "string"
+ },
+ "imageSKU": {
+ "type": "string"
+ },
+ "imageVersion": {
+ "type": "string"
+ },
+ "_artifactsLocation": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "diskSelectionTemplateUri": "_artifactsLocation/nestedtemplates/diskSelection.json_artifactsLocationSasToken"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "name": "vmName-diskSelection",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "_artifactsLocation/nestedtemplates/diskSelection.json_artifactsLocationSasToken"
+ },
+ "parameters": {
+ "vmDiskCount": {
+ "value": "vmDiskCount"
+ },
+ "vmDiskSize": {
+ "value": "vmDiskSize"
+ },
+ "diskCaching": {
+ "value": "None"
+ },
+ "storageAccountUri": {
+ "value": "storageAccountUri"
+ },
+ "diskNamingPrefix": {
+ "value": "vmName-data"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "name": "vmName",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vmName-diskSelection"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets//vmAvailabilitySetName"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "imagePublisher",
+ "offer": "imageOffer",
+ "sku": "imageSku",
+ "version": "imageVersion"
+ },
+ "osDisk": {
+ "name": "vmName_OsDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": "[reference(concat(parameters('vmName'),'-diskSelection')).outputs.dataDiskArray.value]"
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmName-nic"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vmName": {
+ "type": "string",
+ "value": "[parameters('vmName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT82 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT82
new file mode 100644
index 0000000..50a4262
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT82
@@ -0,0 +1,578 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/ds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885694,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/ds13.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT82",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT82",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Admin user name for the VMs"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password for the VMs (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "cmUsername": {
+ "type": "string",
+ "defaultValue": "cmadmin",
+ "metadata": {
+ "description": "User name for the Cloudera Manager"
+ }
+ },
+ "cmPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "password for the Cloudera Manager (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS name where the VMs will be exposed"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "masterStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for master nodes (defaults to Premium_LRS)"
+ },
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for worker nodes (defaults to Standard_LRS)"
+ },
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "clouderavnet",
+ "metadata": {
+ "description": "The name of the virtual network provisioned for the deployment"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "vnetNewOrExisting": {
+ "type": "string",
+ "defaultValue": "new",
+ "allowedValues": [
+ "new",
+ "existing"
+ ],
+ "metadata": {
+ "description": "Indicator for new or exiting Virtual Network"
+ }
+ },
+ "virtualNetworkRGName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Resource Group Name for Vnet. For new VNet leave it empty, otherwise type in existing resource group name"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "clouderasubnet",
+ "metadata": {
+ "description": "Subnet name for the virtual network where resources will be provisioned"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "Virtual Network address CIDR"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "CIDR for the subnet where VMs will be placed"
+ }
+ },
+ "masterNodeIPAddress": {
+ "type": "string",
+ "defaultValue": "10.3.0.4",
+ "metadata": {
+ "description": "IP address for the first master"
+ }
+ },
+ "dataNodeIPOffSetFromMaster": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "IP address from the master node, for example if the first master is 10.1.1.1, then the first dataNode would be 10.1.1.11"
+ }
+ },
+ "tshirtSize": {
+ "type": "string",
+ "defaultValue": "Eval",
+ "allowedValues": [
+ "Eval",
+ "Prod"
+ ],
+ "metadata": {
+ "description": "T-shirt size of the Cloudera cluster (Eval, Prod)"
+ },
+ "value": "Eval"
+ },
+ "numberOfDataNodes": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Number of data nodes for Prod (defaults to 3)"
+ },
+ "value": 3
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D8s_v3",
+ "metadata": {
+ "description": "The size of the VMs deployed in the cluster (defaults to Standard_DS13)"
+ },
+ "value": "Standard_D16s_v3"
+ },
+ "company": {
+ "type": "string",
+ "defaultValue": "Company",
+ "metadata": {
+ "description": "Your Company"
+ },
+ "value": "company"
+ },
+ "emailAddress": {
+ "type": "string",
+ "defaultValue": "email@yourcompany.com",
+ "metadata": {
+ "description": "your email"
+ },
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "type": "string",
+ "defaultValue": "123456789",
+ "metadata": {
+ "description": "your business phone number"
+ },
+ "value": "123456789"
+ },
+ "firstName": {
+ "type": "string",
+ "defaultValue": "FirstName",
+ "metadata": {
+ "description": "Your FirstName"
+ },
+ "value": "FirstName"
+ },
+ "lastName": {
+ "type": "string",
+ "defaultValue": "LastName",
+ "metadata": {
+ "description": "Your LastName"
+ },
+ "value": "LastName"
+ },
+ "jobRole": {
+ "type": "string",
+ "defaultValue": "Administrator",
+ "metadata": {
+ "description": "Job Role"
+ },
+ "allowedValues": [
+ "Administrator",
+ "Analyst (Industry/Finance)",
+ "Analyst (Technical)",
+ "Architect",
+ "C level",
+ "Consultant",
+ "Developer",
+ "Director",
+ "Engineer",
+ "Individual contributor",
+ "Manager",
+ "Partner",
+ "Student",
+ "VP"
+ ],
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "type": "string",
+ "defaultValue": "Analytics / Business Intelligence",
+ "metadata": {
+ "description": "Job Function"
+ },
+ "allowedValues": [
+ "Analytics / Business Intelligence",
+ "Big Data / Architecture",
+ "Data Warehouse / Management",
+ "Data Science",
+ "Database",
+ "ETL / ELT",
+ "Infrastructure",
+ "IT",
+ "Marketing / Sales",
+ "Networking",
+ "Manager",
+ "Security / Compliance",
+ "Storage"
+ ],
+ "value": "Storage"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ }
+ },
+ "variables": {
+ "templateAPIVersion": "2015-11-01",
+ "resourceAPIVersion": "2015-06-15",
+ "installCDH": "True",
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "scriptsUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos",
+ "share-resourcesUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/shared-resources-new-vnet.json",
+ "data-nodeUri": "[concat(variables('scriptsUri'), '/data-node-', toLower(subString(parameters('vmSize'), 9, 4)), '.json')]",
+ "sa": "10.3.0.4",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterStorageAccount": {
+ "type": "Premium_LRS"
+ },
+ "workerStorageAccount": {
+ "type": "Standard_LRS"
+ },
+ "clusterTshirtSizeEval": {
+ "masterNodeCount": 1,
+ "dataNodeCount": 3,
+ "highAvailability": "false"
+ },
+ "clusterTshirtSizeProd": {
+ "masterNodeCount": 3,
+ "dataNodeCount": 3,
+ "highAvailability": "true"
+ },
+ "clusterSpec": "concat(clusterTshirtSize, parameters(tshirtSize))",
+ "vmSpec": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ },
+ "networkSpec": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ },
+ "newVNetId": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "existingVNetId": "parameters('virtualNetworkRGName')/Microsoft.Network/virtualNetworks/GEN-UNIQUE-10",
+ "VNetId": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resources": [
+ {
+ "name": "shared-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/shared-resources-new-vnet.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "masterNodeASName": {
+ "value": "(vmSpec).masterNodeASName"
+ },
+ "dataNodeASName": {
+ "value": "(vmSpec).dataNodeASName"
+ }
+ }
+ }
+ },
+ {
+ "name": "master-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/master-node.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos"
+ },
+ "vmCount": {
+ "value": "(clusterSpec).masterNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "data-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('data-nodeUri')]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos"
+ },
+ "storageAccount": {
+ "value": {
+ "type": "Standard_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).dataNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ }
+ }
+ }
+ },
+ {
+ "name": "setup-cloudera",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/data-node",
+ "Microsoft.Resources/deployments/master-node"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/setup-cloudera.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "GEN-UNIQUE-10",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "GEN-UNIQUE-10"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "fqdn": {
+ "value": "[reference('master-node').outputs.fqdn.value]"
+ },
+ "cmUsername": {
+ "value": "cmadmin"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "company": {
+ "value": "Company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ },
+ "installCDH": {
+ "value": "True"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT820 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT820
new file mode 100644
index 0000000..f446c7a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT820
@@ -0,0 +1,234 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct/azuredeploy.json",
+ "/demos/storage-spaces-direct/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901908,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct/azuredeploy.json",
+ "/demos/storage-spaces-direct/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT820",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT820",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "namePrefix": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 8,
+ "metadata": {
+ "description": "Naming prefix for each new resource created. 3-char min, 8-char max, lowercase alphanumeric"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "storageAccountType": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_GRS",
+ "Standard_RAGRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "Type of new Storage Accounts (Standard_LRS, Standard_GRS, Standard_RAGRS or Premium_LRS) to be created to store VM disks"
+ },
+ "defaultValue": "Premium_LRS"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Size of the S2D VMs to be created"
+ },
+ "defaultValue": "Standard_D2s_v3"
+ },
+ "vmCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 3,
+ "metadata": {
+ "description": "Number of S2D VMs to be created in cluster (Min=2, Max=3)"
+ },
+ "defaultValue": 2
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023,
+ "metadata": {
+ "description": "Size of each data disk in GB on each S2D VM (Min=128, Max=1023)"
+ },
+ "defaultValue": 1023
+ },
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32,
+ "metadata": {
+ "description": "Number of data disks on each S2D VM (Min=2, Max=32). Ensure that the VM size you've selected will support this number of data disks."
+ },
+ "defaultValue": 2
+ },
+ "existingDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS domain name for existing Active Directory domain"
+ },
+ "value": "contoso.com"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Administrator of the existing Active Directory Domain"
+ },
+ "value": "AzureAdmin"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password for the Administrator account of the existing Active Directory Domain"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "existingVirtualNetworkRGName": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group Name for the existing VNET."
+ },
+ "value": "rg01"
+ },
+ "existingVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the existing VNET."
+ },
+ "value": "vnet01"
+ },
+ "existingSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the existing subnet in the existing VNET to which the S2D VMs should be deployed"
+ },
+ "value": "default"
+ },
+ "sofsName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of clustered Scale-Out File Server role"
+ },
+ "defaultValue": "fs01"
+ },
+ "shareName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of shared data folder on clustered Scale-Out File Server role"
+ },
+ "defaultValue": "data"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of resources that the script is dependent on such as linked templates and DSC modules"
+ },
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/301-storage-spaces-direct"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "subnetRef": "rg01/Microsoft.Network/virtualNetworks/subnets/vnet01/default",
+ "deployS2DClusterTemplateURL": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/301-storage-spaces-direct/nestedtemplates/deploy-s2d-cluster.jsonparameters('_artifactsLocationSasToken')",
+ "deployS2DCluster": "deployS2DCluster"
+ },
+ "resources": [
+ {
+ "name": "deployS2DCluster",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/301-storage-spaces-direct/nestedtemplates/deploy-s2d-cluster.jsonparameters('_artifactsLocationSasToken')",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "namePrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "domainName": {
+ "value": "contoso.com"
+ },
+ "adminUsername": {
+ "value": "AzureAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "nicSubnetUri": {
+ "value": "rg01/Microsoft.Network/virtualNetworks/subnets/vnet01/default"
+ },
+ "vmSize": {
+ "value": "Standard_D2s_v3"
+ },
+ "vmCount": {
+ "value": 2
+ },
+ "vmDiskSize": {
+ "value": 1023
+ },
+ "vmDiskCount": {
+ "value": 2
+ },
+ "sofsName": {
+ "value": "fs01"
+ },
+ "shareName": {
+ "value": "data"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/301-storage-spaces-direct"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "sofsPath": {
+ "type": "string",
+ "value": "[concat('\\\\',reference(variables('deployS2DCluster')).outputs.sofsName.value,'\\',reference(variables('deployS2DCluster')).outputs.shareName.value)]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT821 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT821
new file mode 100644
index 0000000..8b84c42
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT821
@@ -0,0 +1,346 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/nestedtemplates/deploy-s2d-cluster.json"
+ ],
+ "timestamp": 1642962901917,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/nestedtemplates/deploy-s2d-cluster.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT821",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.storage/storageaccounts",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT821",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for the VM, only certain regions support zones during preview."
+ },
+ "defaultValue": "[resourceGroup().location]"
+ },
+ "namePrefix": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 8,
+ "metadata": {
+ "description": "Naming prefix for each new resource created. 3-char min, 8-char max, lowercase alphanumeric"
+ }
+ },
+ "domainName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS domain name for existing Active Directory domain"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Administrator of the existing Active Directory Domain"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password for the Administrator account of the existing Active Directory Domain"
+ }
+ },
+ "nicSubnetUri": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource ID for existing vnet/subnet to which VM NICs should be attached"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Size of the S2D VMs to be created"
+ }
+ },
+ "vmCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 3,
+ "metadata": {
+ "description": "Number of S2D VMs to be created in cluster (Min=2, Max=3)"
+ }
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023,
+ "metadata": {
+ "description": "Size of each data disk in GB on each S2D VM (Min=128, Max=1023)"
+ }
+ },
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32,
+ "metadata": {
+ "description": "Number of data disks on each S2D VM (Min=2, Max=32). Ensure that the VM size you've selected will support this number of data disks."
+ }
+ },
+ "sofsName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of clustered Scale-Out File Server role"
+ }
+ },
+ "shareName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of shared data folder on clustered Scale-Out File Server role"
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer"
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer"
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2016-Datacenter"
+ },
+ "imageVersion": {
+ "type": "string",
+ "defaultValue": "latest"
+ },
+ "_artifactsLocation": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "string"
+ }
+ },
+ "variables": {
+ "apiVersionStorage": "2016-01-01",
+ "witnessStorageName": "[concat(parameters('namePrefix'),uniqueString(resourceGroup().id),'cw')]",
+ "witnessStorageType": "Standard_LRS",
+ "vmNamePrefix": "namePrefix-s2d-",
+ "clusterName": "namePrefix-s2d-c",
+ "vmLoopTemplateURL": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/newVM.json',parameters('_artifactsLocationSasToken')))]",
+ "s2dPrepModulesURL": "[uri(parameters('_artifactsLocation'), concat('dsc/prep-s2d.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "s2dPrepFunction": "PrepS2D.ps1\\PrepS2D",
+ "s2dConfigModulesURL": "[uri(parameters('_artifactsLocation'), concat('dsc/config-s2d.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "s2dConfigFunction": "ConfigS2D.ps1\\ConfigS2D",
+ "zones": [
+ "1",
+ "2",
+ "3"
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('witnessStorageName')]",
+ "apiVersion": "2016-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ },
+ {
+ "name": "namePrefix-s2d-copyindex()-nic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2016-10-01",
+ "copy": {
+ "name": "nicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "nicSubnetUri"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": "vmCount"
+ },
+ "name": "namePrefix-s2d-copyindex()-newVM",
+ "dependsOn": [
+ "nicLoop"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/newVM.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vmName": {
+ "value": "namePrefix-s2d-copyindex()"
+ },
+ "vmSize": {
+ "value": "vmSize"
+ },
+ "vmDiskCount": {
+ "value": "vmDiskCount"
+ },
+ "vmDiskSize": {
+ "value": "vmDiskSize"
+ },
+ "adminUsername": {
+ "value": "adminUsername"
+ },
+ "adminPassword": {
+ "value": "adminPassword"
+ },
+ "_artifactsLocation": {
+ "value": "_artifactsLocation"
+ },
+ "_artifactsLocationSasToken": {
+ "value": "_artifactsLocationSasToken"
+ },
+ "imagePublisher": {
+ "value": "MicrosoftWindowsServer"
+ },
+ "imageOffer": {
+ "value": "WindowsServer"
+ },
+ "imageSKU": {
+ "value": "2016-Datacenter"
+ },
+ "imageVersion": {
+ "value": "latest"
+ },
+ "zones": {
+ "value": "[take(skip(variables('zones'),mod(copyIndex(),length(variables('zones')))),1)]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "[concat(variables('vmNamePrefix'),copyindex(1),'/s2dPrep')]",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "virtualMachineLoop"
+ ],
+ "copy": {
+ "name": "virtualMachineExtensionLoop",
+ "count": "[sub(parameters('vmCount'),1)]"
+ },
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.20",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "[uri(parameters('_artifactsLocation'), concat('dsc/prep-s2d.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "configurationFunction": "PrepS2D.ps1\\PrepS2D",
+ "properties": {
+ "domainName": "domainName",
+ "adminCreds": {
+ "userName": "adminUserName",
+ "password": "PrivateSettingsRef:adminPassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "items": {
+ "adminPassword": "adminPassword"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namePrefix-s2d-0/s2dConfig",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "virtualMachineLoop",
+ "virtualMachineExtensionLoop",
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('witnessStorageName'))]"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.20",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "modulesUrl": "[uri(parameters('_artifactsLocation'), concat('dsc/config-s2d.ps1.zip',parameters('_artifactsLocationSasToken')))]",
+ "configurationFunction": "ConfigS2D.ps1\\ConfigS2D",
+ "properties": {
+ "domainName": "domainName",
+ "clusterName": "namePrefix-s2d-c",
+ "sofsName": "sofsName",
+ "shareName": "shareName",
+ "vmNamePrefix": "namePrefix-s2d-",
+ "vmCount": "vmCount",
+ "vmDiskSize": "vmDiskSize",
+ "witnessStorageName": "[variables('witnessStorageName')]",
+ "witnessStorageKey": {
+ "userName": "PLACEHOLDER-DO-NOT-USE",
+ "password": "PrivateSettingsRef:witnessStorageKey"
+ },
+ "adminCreds": {
+ "userName": "adminUserName",
+ "password": "PrivateSettingsRef:adminPassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "items": {
+ "adminPassword": "adminPassword",
+ "witnessStorageKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts',variables('witnessStorageName')),variables('apiVersionStorage')).keys[0].value]"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "sofsName": {
+ "type": "string",
+ "value": "[parameters('sofsName')]"
+ },
+ "shareName": {
+ "type": "string",
+ "value": "[parameters('shareName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT822 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT822
new file mode 100644
index 0000000..e1f3a76
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT822
@@ -0,0 +1,290 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/nestedtemplates/diskSelection.json"
+ ],
+ "timestamp": 1642962901939,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/nestedtemplates/diskSelection.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT822",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": []
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT822",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023
+ },
+ "diskCaching": {
+ "type": "string",
+ "allowedValues": [
+ "None",
+ "ReadOnly",
+ "ReadWrite"
+ ],
+ "defaultValue": "None"
+ },
+ "diskNamingPrefix": {
+ "type": "string"
+ }
+ },
+ "variables": {
+ "diskArray": [
+ {
+ "name": "diskNamingPrefixdisk0",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 0,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk1",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 1,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk2",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 2,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk3",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 3,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk4",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 4,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk5",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 5,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk6",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 6,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk7",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 7,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk8",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 8,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk9",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 9,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk10",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 10,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk11",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 11,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk12",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 12,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk13",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 13,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk14",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 14,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk15",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 15,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk16",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 16,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk17",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 17,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk18",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 18,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk19",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 19,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk20",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 20,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk21",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 21,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk22",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 22,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk23",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 23,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk24",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 24,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk25",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 25,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk26",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 26,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk27",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 27,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk28",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 28,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk29",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 29,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk30",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 30,
+ "caching": "None",
+ "createOption": "Empty"
+ },
+ {
+ "name": "diskNamingPrefixdisk31",
+ "diskSizeGB": "vmDiskSize",
+ "lun": 31,
+ "caching": "None",
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "resources": [],
+ "outputs": {
+ "dataDiskArray": {
+ "type": "array",
+ "value": "[take(variables('diskArray'),parameters('vmDiskCount'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT823 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT823
new file mode 100644
index 0000000..9b17b53
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT823
@@ -0,0 +1,156 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/nestedtemplates/newVM.json"
+ ],
+ "timestamp": 1642962901952,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/nestedtemplates/newVM.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT823",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT823",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "vmDiskCount": {
+ "type": "int"
+ },
+ "vmDiskSize": {
+ "type": "int"
+ },
+ "adminUsername": {
+ "type": "string"
+ },
+ "adminPassword": {
+ "type": "securestring"
+ },
+ "imagePublisher": {
+ "type": "string"
+ },
+ "imageOffer": {
+ "type": "string"
+ },
+ "imageSKU": {
+ "type": "string"
+ },
+ "imageVersion": {
+ "type": "string"
+ },
+ "zones": {
+ "type": "array"
+ },
+ "_artifactsLocation": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "string"
+ }
+ },
+ "variables": {
+ "diskSelectionTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/diskSelection.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "name": "vmName-diskSelection",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/diskSelection.json',parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "vmDiskCount": {
+ "value": "vmDiskCount"
+ },
+ "vmDiskSize": {
+ "value": "vmDiskSize"
+ },
+ "diskCaching": {
+ "value": "None"
+ },
+ "diskNamingPrefix": {
+ "value": "vmName-data"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "name": "vmName",
+ "zones": "zones",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/vmName-diskSelection"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmName",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "imagePublisher",
+ "offer": "imageOffer",
+ "sku": "imageSku",
+ "version": "imageVersion"
+ },
+ "osDisk": {
+ "name": "vmName-osdisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": "[reference(concat(parameters('vmName'),'-diskSelection')).outputs.dataDiskArray.value]"
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/vmName-nic"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vmName": {
+ "type": "string",
+ "value": "[parameters('vmName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT824 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT824
new file mode 100644
index 0000000..ad6f796
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT824
@@ -0,0 +1,228 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/azuredeploy.json",
+ "/demos/storage-spaces-direct-md-zones/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901968,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/storage-spaces-direct-md-zones/azuredeploy.json",
+ "/demos/storage-spaces-direct-md-zones/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT824",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT824",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "allowedValues": [],
+ "metadata": {
+ "description": "Location for the VM, only certain regions support zones during, Azure Government will not use zones."
+ }
+ },
+ "namePrefix": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 8,
+ "metadata": {
+ "description": "Naming prefix for each new resource created. 3-char min, 8-char max, lowercase alphanumeric"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Size of the S2D VMs to be created"
+ },
+ "defaultValue": "Standard_D2_v3"
+ },
+ "vmCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 3,
+ "metadata": {
+ "description": "Number of S2D VMs to be created in cluster (Min=2, Max=3)"
+ },
+ "defaultValue": 2
+ },
+ "vmDiskSize": {
+ "type": "int",
+ "minValue": 128,
+ "maxValue": 1023,
+ "metadata": {
+ "description": "Size of each data disk in GB on each S2D VM (Min=128, Max=1023)"
+ },
+ "defaultValue": 128
+ },
+ "vmDiskCount": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 32,
+ "metadata": {
+ "description": "Number of data disks on each S2D VM (Min=2, Max=32). Ensure that the VM size you've selected will support this number of data disks."
+ },
+ "defaultValue": 2
+ },
+ "existingDomainName": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS domain name for existing Active Directory domain"
+ },
+ "value": "contoso.com"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Administrator of the existing Active Directory Domain"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "minLength": 12,
+ "metadata": {
+ "description": "Password for the Administrator account of the existing Active Directory Domain"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "existingVirtualNetworkRGName": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group Name for the existing VNET."
+ },
+ "value": "rg01"
+ },
+ "existingVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the existing VNET."
+ },
+ "value": "vnet01"
+ },
+ "existingSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the existing subnet in the existing VNET to which the S2D VMs should be deployed"
+ },
+ "value": "default"
+ },
+ "sofsName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of clustered Scale-Out File Server role"
+ },
+ "defaultValue": "fs01"
+ },
+ "shareName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of shared data folder on clustered Scale-Out File Server role"
+ },
+ "defaultValue": "data"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of resources that the script is dependent on such as linked templates and DSC modules"
+ },
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/storage-spaces-direct-md-zones/"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Not required for default location. The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "subnetRef": "rg01/Microsoft.Network/virtualNetworks/subnets/vnet01/default",
+ "deployS2DClusterTemplateURL": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/deploy-s2d-cluster.json', parameters('_artifactsLocationSasToken')))]",
+ "deployS2DCluster": "deployS2DCluster"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "name": "deployS2DCluster",
+ "dependsOn": [],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/deploy-s2d-cluster.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "location"
+ },
+ "namePrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "domainName": {
+ "value": "contoso.com"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "nicSubnetUri": {
+ "value": "rg01/Microsoft.Network/virtualNetworks/subnets/vnet01/default"
+ },
+ "vmSize": {
+ "value": "Standard_D2_v3"
+ },
+ "vmCount": {
+ "value": 2
+ },
+ "vmDiskSize": {
+ "value": 128
+ },
+ "vmDiskCount": {
+ "value": 2
+ },
+ "sofsName": {
+ "value": "fs01"
+ },
+ "shareName": {
+ "value": "data"
+ },
+ "_artifactsLocation": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/demos/storage-spaces-direct-md-zones/"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "sofsPath": {
+ "type": "string",
+ "value": "[concat('\\\\',reference(variables('deployS2DCluster')).outputs.sofsName.value,'\\',reference(variables('deployS2DCluster')).outputs.shareName.value)]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT825 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT825
new file mode 100644
index 0000000..11b07de
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT825
@@ -0,0 +1,83 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/AVSet.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901982,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/AVSet.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT825",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT825",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "availabilitySetName": {
+ "type": "string",
+ "defaultValue": "AvSet1",
+ "metadata": {
+ "description": "AVSet name the VM will belong to"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "dnsLabelPrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageCategory": {
+ "value": "Premium"
+ },
+ "numberOfSubnets": {
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "value": 1
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "AvSet1",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT826 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT826
new file mode 100644
index 0000000..c7cc517
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT826
@@ -0,0 +1,665 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/azuredeploy.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962901991,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/azuredeploy.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT826",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT826",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "numberOfSubnets": {
+ "type": "int",
+ "defaultValue": 3,
+ "minValue": 2,
+ "maxValue": 20,
+ "metadata": {
+ "description": "Number of subnets in the VNet. Must be between 2 and 20"
+ },
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "type": "int",
+ "defaultValue": 1,
+ "minValue": 1,
+ "maxValue": 20,
+ "metadata": {
+ "description": "Member servers for each subnet. Must be between 1 and 20"
+ },
+ "value": 1
+ },
+ "storageCategory": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "metadata": {
+ "description": "Storage type. Can be either Standard (HDD) or Premium (SSD)"
+ },
+ "allowedValues": [
+ "Standard",
+ "Premium"
+ ],
+ "value": "Premium"
+ },
+ "domainName": {
+ "type": "string",
+ "defaultValue": "fabrikam.com",
+ "metadata": {
+ "description": "Domain to create for the Lab"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS label for the deployment. The fqdn will look something like 'dnsname.region.cloudapp.azure.com'. Up to 62 chars, digits or dashes, lowercase, should start with a letter: must conform to '^[a-z][a-z0-9-]{1,61}[a-z0-9]$'."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size of the VM"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "vnetName": "[uniqueString(resourceGroup().id, 'labVNet')]",
+ "labVNetPrefix": "172.16.0.0/12",
+ "storageAccountSuffix": "st",
+ "adDataDiskSize": "30",
+ "mbrDataDiskSize": "127"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-10-01",
+ "name": "sbn0",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('LabSubnet.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.1.0.0"
+ },
+ "parameters": {
+ "labVNetPrefix": {
+ "value": "172.16.0.0/12"
+ },
+ "subnets": {
+ "value": []
+ },
+ "addedSubnetName": {
+ "value": "sbn-Central"
+ },
+ "addedSubnetPrefix": {
+ "value": "172.16.0.0/24"
+ },
+ "vnetName": {
+ "value": "[uniqueString(resourceGroup().id, 'labVNet')]"
+ },
+ "dnsLabel": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "[concat('sbn', copyIndex(1))]",
+ "type": "Microsoft.Resources/deployments",
+ "copy": {
+ "name": "iter",
+ "count": "[add(parameters('numberOfSubnets'),-1)]"
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('LabSubnet.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.1.0.0"
+ },
+ "parameters": {
+ "labVNetPrefix": {
+ "value": "172.16.0.0/12"
+ },
+ "subnets": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', concat('sbn', copyIndex()))).outputs.vnetSubnets.value]"
+ },
+ "vnetName": {
+ "value": "[uniqueString(resourceGroup().id, 'labVNet')]"
+ },
+ "dnsLabel": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "addedSubnetName": {
+ "value": "[concat('sbn-',copyIndex(1))]"
+ },
+ "addedSubnetPrefix": {
+ "value": "[concat('172.16.',copyIndex(1),'.0/24')]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "LabStorage",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('Storage.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.1.0.0"
+ },
+ "parameters": {
+ "storageAccountSuffix": {
+ "value": "st"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "Step0",
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('AVSet.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "availabilitySetName": {
+ "value": "AVSetDC"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "confDC0",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//sbn0",
+ "Microsoft.Resources/deployments/LabStorage",
+ "Microsoft.Resources/deployments/dc0"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('ConfigDC.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.1.0.0"
+ },
+ "parameters": {
+ "indx": {
+ "value": 0
+ },
+ "vmNamePrefix": {
+ "value": ""
+ },
+ "computerName": {
+ "value": "dc"
+ },
+ "domainName": {
+ "value": "fabrikam.com"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "Step1",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/dc0"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('SetVNetDNS.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "dnsServerAddresses": {
+ "value": [
+ "[reference('dc0').outputs.vmIPAddress.value]"
+ ]
+ },
+ "virtualNetworkName": {
+ "value": "[uniqueString(resourceGroup().id, 'labVNet')]"
+ },
+ "virtualNetworkSubnets": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', concat('sbn', add(parameters('numberOfSubnets'),-1)))).outputs.vnetSubnets.value]"
+ },
+ "virtualNetworkAddressRanges": {
+ "value": [
+ "172.16.0.0/12"
+ ]
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "dc0",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/Step0"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('WinServ.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.2.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "indx": {
+ "value": 0
+ },
+ "bootDiagnostics": {
+ "value": false
+ },
+ "vmSize": {
+ "value": "Standard_D2s_v3"
+ },
+ "lbName": {
+ "value": "[reference('sbn0').outputs.lbName.value]"
+ },
+ "computerName": {
+ "value": "dc"
+ },
+ "publicStartRdpPort": {
+ "value": 5000
+ },
+ "subnets": {
+ "value": "[reference('sbn0').outputs.vnetSubnets.value]"
+ },
+ "storageAccountName": {
+ "value": "[reference('LabStorage').outputs.storageAccountName.value]"
+ },
+ "availabilitySetName": {
+ "value": "AvSetDC"
+ },
+ "vmNamePrefix": {
+ "value": ""
+ },
+ "nicNamePrefix": {
+ "value": "nic"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "dDisks": {
+ "value": [
+ {
+ "name": "dc0dataDisk0",
+ "caching": "None",
+ "createOption": "Empty",
+ "diskSizeGB": "30",
+ "lun": 0
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "[concat('dc', copyIndex(1))]",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/Step1",
+ "Microsoft.Resources/deployments/dc0"
+ ],
+ "copy": {
+ "name": "otherDCs",
+ "count": "[add(parameters('numberOfSubnets'),-1)]"
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('WinServ.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.2.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "indx": {
+ "value": "[copyIndex(1)]"
+ },
+ "bootDiagnostics": {
+ "value": false
+ },
+ "vmSize": {
+ "value": "Standard_D2s_v3"
+ },
+ "lbName": {
+ "value": "[reference('sbn0').outputs.lbName.value]"
+ },
+ "computerName": {
+ "value": "dc"
+ },
+ "publicStartRdpPort": {
+ "value": 5000
+ },
+ "subnets": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', concat('sbn', add(parameters('numberOfSubnets'),-1)))).outputs.vnetSubnets.value]"
+ },
+ "storageAccountName": {
+ "value": "[reference('LabStorage').outputs.storageAccountName.value]"
+ },
+ "availabilitySetName": {
+ "value": "AvSetDC"
+ },
+ "vmNamePrefix": {
+ "value": ""
+ },
+ "nicNamePrefix": {
+ "value": "nic"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "dDisks": {
+ "value": [
+ {
+ "name": "[concat('adDataDisk', copyIndex(1))]",
+ "caching": "None",
+ "createOption": "Empty",
+ "diskSizeGB": "30",
+ "lun": 0
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "MemberscopyIndex()",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/Step1",
+ "Microsoft.Resources/deployments/dc0"
+ ],
+ "copy": {
+ "name": "members",
+ "count": "[mul(parameters('numberOfSubnets'),parameters('memberServersPerSubnet'))]"
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('WinServ.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.2.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "indx": {
+ "value": "[copyIndex()]"
+ },
+ "bootDiagnostics": {
+ "value": false
+ },
+ "vmSize": {
+ "value": "Standard_D2s_v3"
+ },
+ "lbName": {
+ "value": "[reference('sbn0').outputs.lbName.value]"
+ },
+ "computerName": {
+ "value": "srvMbmr"
+ },
+ "publicStartRdpPort": {
+ "value": 6000
+ },
+ "subnets": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', concat('sbn', add(parameters('numberOfSubnets'),-1)))).outputs.vnetSubnets.value]"
+ },
+ "storageAccountName": {
+ "value": "[reference('LabStorage').outputs.storageAccountName.value]"
+ },
+ "availabilitySetName": {
+ "value": "AVSetDC"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "dDisks": {
+ "value": [
+ {
+ "name": "dataDiskcopyIndex()",
+ "caching": "None",
+ "createOption": "Empty",
+ "diskSizeGB": "127",
+ "lun": 0
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "[concat('confDc', copyIndex(1))]",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/confDC0",
+ "[resourceId('Microsoft.Resources/deployments', concat('dc', copyIndex(1)))]"
+ ],
+ "copy": {
+ "name": "otherDCConfs",
+ "count": "[add(parameters('numberOfSubnets'),-1)]"
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('ConfigDC.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.1.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "indx": {
+ "value": "[copyIndex(1)]"
+ },
+ "computerName": {
+ "value": "dc"
+ },
+ "vmNamePrefix": {
+ "value": ""
+ },
+ "domainName": {
+ "value": "fabrikam.com"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-10-01",
+ "name": "confMemberscopyIndex()",
+ "type": "Microsoft.Resources/deployments",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/confDC0",
+ "Microsoft.Resources/deployments/MemberscopyIndex()"
+ ],
+ "copy": {
+ "name": "confMembers",
+ "count": "[mul(parameters('numberOfSubnets'),parameters('memberServersPerSubnet'))]"
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('confDomainMember.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.1.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "indx": {
+ "value": "[copyIndex()]"
+ },
+ "computerName": {
+ "value": "srvMbmr"
+ },
+ "domainName": {
+ "value": "fabrikam.com"
+ },
+ "domainJoinUsername": {
+ "value": "zeAdmin"
+ },
+ "domainJoinPassword": {
+ "value": "GEN-PASSWORD"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vmIPAddress": {
+ "type": "string",
+ "value": "[reference('dc0').outputs.vmIPAddress.value]"
+ },
+ "subnets": {
+ "type": "array",
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', concat('sbn',add(parameters('numberOfSubnets'),-1)))).outputs.vnetSubnets.value]"
+ },
+ "lenVnetSubnets": {
+ "type": "int",
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', concat('sbn',add(parameters('numberOfSubnets'),-1)))).outputs.vnetLength.value]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT827 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT827
new file mode 100644
index 0000000..fd2e93e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT827
@@ -0,0 +1,135 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/confDomainMember.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902006,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/confDomainMember.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT827",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT827",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.1.0.0",
+ "parameters": {
+ "indx": {
+ "type": "int",
+ "defaultValue": 0,
+ "metadata": {
+ "description": "Index to create multiple DCs. Index == 0 means it will be a new domain and a PDCE will be created"
+ }
+ },
+ "computerName": {
+ "type": "string",
+ "defaultValue": "mbmr",
+ "metadata": {
+ "description": "Computer Name, will be suffixed by the indx"
+ }
+ },
+ "domainJoinPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password to join the domain"
+ }
+ },
+ "domainName": {
+ "type": "string",
+ "defaultValue": "fabrikam.com",
+ "metadata": {
+ "description": "The FQDN of the AD Domain created "
+ }
+ },
+ "OUPath": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Organizational unit for the domain"
+ }
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "srv-",
+ "metadata": {
+ "description": "Name of the vm, will be suffixed by the indx"
+ }
+ },
+ "domainJoinUsername": {
+ "type": "string",
+ "defaultValue": "zeAdmin",
+ "metadata": {
+ "description": "The user to join the domain"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "dnsLabelPrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageCategory": {
+ "value": "Premium"
+ },
+ "numberOfSubnets": {
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "value": 1
+ }
+ },
+ "variables": {
+ "vmName": "srv-mbmr parameters('indx')"
+ },
+ "resources": [
+ {
+ "name": "srv-mbmr parameters('indx')/extensions",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "location": "location",
+ "apiVersion": "2020-12-01",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "JsonADDomainExtension",
+ "typeHandlerVersion": "1.3",
+ "settings": {
+ "Name": "fabrikam.com",
+ "OUPath": "",
+ "User": "zeAdmin@fabrikam.com",
+ "Restart": true,
+ "Options": 3
+ },
+ "protectedSettings": {
+ "Password": "domainJoinPassword"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT828 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT828
new file mode 100644
index 0000000..bcb7167
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT828
@@ -0,0 +1,144 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/ConfigDC.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902015,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/ConfigDC.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT828",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT828",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.1.0.0",
+ "parameters": {
+ "indx": {
+ "type": "int",
+ "defaultValue": 0,
+ "metadata": {
+ "description": "Index to create multiple DCs. Index == 0 means it will be a new domain and a PDCE will be created"
+ }
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "DC-"
+ },
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "zeAdmin",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "domainName": {
+ "type": "string",
+ "defaultValue": "contoso.com",
+ "metadata": {
+ "description": "The FQDN of the AD Domain created "
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ }
+ },
+ "computerName": {
+ "type": "string",
+ "defaultValue": "dc",
+ "metadata": {
+ "description": "Computer Name"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "dnsLabelPrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "storageCategory": {
+ "value": "Premium"
+ },
+ "numberOfSubnets": {
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "value": 1
+ }
+ },
+ "variables": {
+ "adConfigurationFunction": "CreateADC.ps1\\CreateADC_[mod(add(parameters('indx'),2),add(parameters('indx'),1))]",
+ "adModulesURL": "[uri(parameters('_artifactsLocation'), concat('CreateADC.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "dscFiletocall": "[mod(add(parameters('indx'),2),add(parameters('indx'),1))]",
+ "vmName": "DC-dc parameters('indx')"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "DC-dc parameters('indx')/CreateDCparameters('indx')",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "wmfVersion": "4.0",
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), concat('CreateADC.ps1.zip', parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "CreateADC.ps1\\CreateADC_[mod(add(parameters('indx'),2),add(parameters('indx'),1))]",
+ "Properties": {
+ "DomainName": "contoso.com",
+ "AdminCreds": {
+ "UserName": "zeAdmin",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "GEN-PASSWORD"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT829 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT829
new file mode 100644
index 0000000..439e6f0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT829
@@ -0,0 +1,197 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/LabSubnet.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902028,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/LabSubnet.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT829",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT829",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.1.0.0",
+ "parameters": {
+ "labVNetPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "VNet prefix (CIDR)"
+ }
+ },
+ "subnets": {
+ "type": "array",
+ "metadata": {
+ "description": "Array of subnets to be created"
+ }
+ },
+ "dnsLabel": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS label for the deployment. The fqdn will look something like '..cloudapp.azure.com'. Up to 62 chars, digits or dashes, lowercase, should start with a letter: must conform to '^[a-z][a-z0-9-]{1,61}[a-z0-9]$'."
+ }
+ },
+ "vnetName": {
+ "type": "string",
+ "defaultValue": "labVNet",
+ "metadata": {
+ "description": "Virtual Network name"
+ }
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "defaultValue": "PublicIP",
+ "metadata": {
+ "description": "Public address name, for lb configuration."
+ }
+ },
+ "addedSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the subnet to add"
+ }
+ },
+ "addedSubnetPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "CIDR prefix of the subnet to add"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "dnsLabelPrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageCategory": {
+ "value": "Premium"
+ },
+ "numberOfSubnets": {
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "value": 1
+ }
+ },
+ "variables": {
+ "publicIPAddressName": "[uniqueString(resourceGroup().id, 'PublicIP')]",
+ "lbName": "[uniqueString(resourceGroup().id, 'labLB')]",
+ "sbn": [
+ {
+ "name": "addedSubnetName",
+ "properties": {
+ "addressPrefix": "addedSubnetPrefix"
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "name": "[uniqueString(resourceGroup().id, 'labLB')]",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//PublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontend",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/PublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LoadBalancerBackend"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "PublicIP",
+ "location": "location",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsLabel"
+ }
+ }
+ },
+ {
+ "name": "labVNet",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "apiVersion": "2020-11-01",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//PublicIP"
+ ],
+ "tags": {
+ "displayName": "labVNet"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "labVNetPrefix"
+ ]
+ },
+ "subnets": "subnets[{'name': 'addedSubnetName', 'properties': {'addressPrefix': 'addedSubnetPrefix'}}]"
+ }
+ }
+ ],
+ "outputs": {
+ "vnetSubnets": {
+ "type": "array",
+ "value": "[reference(parameters('vnetName')).subnets]"
+ },
+ "vnetLength": {
+ "type": "int",
+ "value": "[length(reference(parameters('vnetName')).subnets)]"
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "value": "[variables('publicIPAddressName')]"
+ },
+ "lbName": {
+ "type": "string",
+ "value": "[variables('lbName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT83 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT83
new file mode 100644
index 0000000..a40fa25
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT83
@@ -0,0 +1,312 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/master-node.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885722,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/master-node.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT83",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT83",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "singleQuote": "'",
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "GEN-UNIQUE-10-mn",
+ "nicName": "GEN-UNIQUE-10-mn-nic",
+ "publicIPAddressName": "GEN-UNIQUE-10-mn-publicIP",
+ "storageAccountName": "storageAccount",
+ "securityGroupName": "GEN-UNIQUE-10-mn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "GEN-UNIQUE-10-mn-sg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-10-mn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-10-mncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE-10-mn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-mn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-mn-sg"
+ ],
+ "copy": {
+ "name": "masterNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').ipOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').ipOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-mn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-mn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2017-03-30",
+ "name": "GEN-UNIQUE-10-mncopyIndex()",
+ "plan": "vmSpec",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "masterNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-mn-niccopyIndex()"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": false
+ }
+ },
+ "storageProfile": {
+ "imageReference": "vmSpec",
+ "osDisk": {
+ "name": "GEN-UNIQUE-10-mncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "GEN-UNIQUE-10-mncopyIndex()_DataDisk1",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-mncopyIndex()_DataDisk2",
+ "diskSizeGB": 512,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-mncopyIndex()_DataDisk3",
+ "diskSizeGB": 512,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-mncopyIndex()_DataDisk4",
+ "diskSizeGB": 512,
+ "lun": 3,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-mn-niccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-10-mncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nameNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE-10-mncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-masternode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh ', variables('singleQuote'), variables('masterIP'), variables('singleQuote'), ' ', variables('singleQuote'), variables('workerIP'), variables('singleQuote'), ' ', variables('singleQuote'), parameters('dnsNamePrefix'), variables('singleQuote'), ' ', variables('singleQuote'), reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').masterNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').dataNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('vmSpec').adminUsername, variables('singleQuote'), ' ', 'masternode', ' >> /var/log/cloudera-azure-initialize.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "fqdn": {
+ "type": "string",
+ "value": "[reference(concat(variables('publicIPAddressName'), '0')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT830 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT830
new file mode 100644
index 0000000..b96383c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT830
@@ -0,0 +1,107 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/SetVNetDNS.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902040,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/SetVNetDNS.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT830",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT830",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "Description": "The name of the Virtual to change the DNS on"
+ }
+ },
+ "virtualNetworkSubnets": {
+ "type": "array",
+ "metadata": {
+ "Description": "Subnets already created"
+ }
+ },
+ "virtualNetworkAddressRanges": {
+ "type": "array",
+ "metadata": {
+ "Description": "The address ranges of the new VNET in CIDR format"
+ },
+ "defaultValue": [
+ "10.0.0.0/16"
+ ]
+ },
+ "dnsServerAddresses": {
+ "type": "array",
+ "metadata": {
+ "Description": "The DNS address(es) of the DNS Server(s) used by the VNET"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "dnsLabelPrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageCategory": {
+ "value": "Premium"
+ },
+ "numberOfSubnets": {
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "value": 1
+ }
+ },
+ "resources": [
+ {
+ "name": "virtualNetworkName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "apiVersion": "2020-11-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": "virtualNetworkSubnets",
+ "dhcpOptions": {
+ "dnsServers": "dnsServerAddresses"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT831 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT831
new file mode 100644
index 0000000..6e100f9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT831
@@ -0,0 +1,88 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/Storage.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902052,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/Storage.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT831",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT831",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.1.0.0",
+ "parameters": {
+ "storageAccountSuffix": {
+ "type": "string",
+ "metadata": {
+ "description": "Suffix for the storage account"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "dnsLabelPrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "adminUsername": {
+ "value": "zeAdmin"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "storageCategory": {
+ "value": "Premium"
+ },
+ "numberOfSubnets": {
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "value": 1
+ }
+ },
+ "variables": {
+ "storageName": "[concat(uniqueString(resourceGroup().id),parameters('storageAccountSuffix'))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageName')]",
+ "apiVersion": "2021-02-01",
+ "location": "location",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ }
+ ],
+ "outputs": {
+ "storageAccountName": {
+ "type": "string",
+ "value": "[variables('storageName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT832 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT832
new file mode 100644
index 0000000..b013c66
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT832
@@ -0,0 +1,352 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/subnet-driven-deployment/WinServ.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902062,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/subnet-driven-deployment/WinServ.json",
+ "/demos/subnet-driven-deployment/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT832",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/loadbalancers/inboundnatrules"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT832",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.2.0.0",
+ "parameters": {
+ "dDisks": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "Array of disks objects that can be added (see azuredeploy.json for the disk object content)"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "zeAdmin"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ }
+ },
+ "availabilitySetName": {
+ "type": "string",
+ "defaultValue": "AVSet1",
+ "metadata": {
+ "description": "Availibility Set the VM will belong to"
+ }
+ },
+ "computerName": {
+ "type": "string",
+ "defaultValue": "mbmr",
+ "metadata": {
+ "description": "Computer Name"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "imageVersion": {
+ "type": "string",
+ "defaultValue": "latest",
+ "metadata": {
+ "description": "Image version, 'latest' by default (recommended)"
+ }
+ },
+ "indx": {
+ "type": "int",
+ "defaultValue": 0,
+ "metadata": {
+ "description": "objects suffix to avoid name collisions"
+ }
+ },
+ "lbName": {
+ "type": "string",
+ "defaultValue": "lbn",
+ "metadata": {
+ "description": "Front End load Balancer Name'."
+ }
+ },
+ "natRulePrefix": {
+ "type": "string",
+ "defaultValue": "nr-",
+ "metadata": {
+ "description": "Prefix for Nat Rules."
+ }
+ },
+ "nicNamePrefix": {
+ "type": "string",
+ "defaultValue": "nic-",
+ "metadata": {
+ "description": "Prefix for NICs."
+ }
+ },
+ "publicStartRdpPort": {
+ "type": "int",
+ "defaultValue": 5500,
+ "metadata": {
+ "description": "Public port, for RDP remote connection. The value of indx parameter will be added"
+ }
+ },
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Storage to put the disk image on"
+ }
+ },
+ "subnets": {
+ "type": "array",
+ "metadata": {
+ "description": "list of subnets where the VM will belong to"
+ }
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "srv-"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A2",
+ "metadata": {
+ "description": "VM Size, from // Get-AzureRoleSize | select instanceSize"
+ }
+ },
+ "bootDiagnostics": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Activate boot diagnostics. MUST be set to false is premium storage option is used"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "dnsLabelPrefix": {
+ "value": "GEN-UNIQUE-8"
+ },
+ "storageCategory": {
+ "value": "Premium"
+ },
+ "numberOfSubnets": {
+ "value": 4
+ },
+ "memberServersPerSubnet": {
+ "value": 1
+ }
+ },
+ "variables": {
+ "frontEndIPConfigID": "Microsoft.Network/loadBalancers/frontendIPConfigurations/lbn/loadBalancerFrontend",
+ "natRuleName": "nr-mbmr parameters('indx')",
+ "inboundNatName": "lbn/nr-mbmr parameters('indx')",
+ "subnetIndex": "[mod(parameters('indx'),length(parameters('subnets')))]",
+ "subnetRef": "subnets)[variables(subnetIndex",
+ "vmName": "srv-mbmr parameters('indx')",
+ "nicName": "nic-mbmr parameters('indx')",
+ "rdpPort": "[add(parameters('publicStartRdpPort'), parameters('indx'))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/loadBalancers/inboundNatRules",
+ "name": "lbn/nr-mbmr parameters('indx')",
+ "location": "location",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/lbn/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": "[add(parameters('publicStartRdpPort'), parameters('indx'))]",
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nic-mbmr parameters('indx')",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers/inboundNatRules/lbn/nr-mbmr parameters('indx')"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "subnets)[variables(subnetIndex"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/lbn/LoadBalancerBackend"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/lbn/nr-mbmr parameters('indx')"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "srv-mbmr parameters('indx')",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nic-mbmr parameters('indx')"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/AVSet1"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "mbmrparameters('indx')",
+ "adminUsername": "zeAdmin",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "osdisksrv-mbmr parameters('indx')",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": []
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nic-mbmr parameters('indx')"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": false,
+ "storageUri": "[concat('https://',parameters('storageAccountName'),'.blob.', environment().suffixes.storage)]"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "srv-mbmr parameters('indx')/BgInfo",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "location": "location",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//srv-mbmr parameters('indx')"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "BGInfo",
+ "typeHandlerVersion": "2.1",
+ "settings": {
+ "properties": []
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "srv-mbmr parameters('indx')/MyCustomScriptExtension",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//srv-mbmr parameters('indx')",
+ "Microsoft.Compute/virtualMachines/extensions/srv-mbmr parameters('indx')/BgInfo"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.4",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('start.ps1', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "vmIPAddress": {
+ "type": "string",
+ "value": "[reference(variables('nicName')).ipConfigurations[0].properties.privateIPAddress]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT833 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT833
new file mode 100644
index 0000000..33b2cc7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT833
@@ -0,0 +1,322 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/symantec-extension-windows-vm/azuredeploy.json",
+ "/demos/symantec-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902070,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/symantec-extension-windows-vm/azuredeploy.json",
+ "/demos/symantec-extension-windows-vm/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT833",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT833",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "Type of the Storage Account"
+ }
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "metadata": {
+ "description": "Public IP Address Name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": "Dynamic",
+ "allowedValues": [
+ "Dynamic"
+ ],
+ "metadata": {
+ "description": "Public IP Address Type"
+ },
+ "value": "Dynamic"
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the VM"
+ },
+ "value": "azureVM"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A0",
+ "metadata": {
+ "description": "Size of the VM"
+ },
+ "value": "Standard_A2"
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "VNET Name"
+ },
+ "value": "azureVnet"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "VNET address space"
+ }
+ },
+ "subnet1Name": {
+ "type": "string",
+ "defaultValue": "Subnet-1",
+ "metadata": {
+ "description": "Subnet 1 name"
+ }
+ },
+ "subnet1Prefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet 1 address space"
+ }
+ },
+ "nicName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the NIC"
+ },
+ "value": "azureNic"
+ },
+ "vmExtensionName": {
+ "type": "string",
+ "metadata": {
+ "description": "Extension name"
+ },
+ "value": "malware"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat(uniquestring(resourceGroup().id),'storage')]",
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-08-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "azureVnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "azureNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//GEN-UNIQUE",
+ "Microsoft.Network/virtualNetworks//azureVnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//azureVnet/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "azureVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', parameters('nicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "azureVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "azureVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/azureNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "azureVM/malware",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//azureVM"
+ ],
+ "properties": {
+ "publisher": "Symantec",
+ "type": "SymantecEndpointProtection",
+ "typeHandlerVersion": "12.1"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT835 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT835
new file mode 100644
index 0000000..c9180c4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT835
@@ -0,0 +1,354 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/traffic-manager-application-gateway-demo-setup/nested/azuredeploywebserver.json"
+ ],
+ "timestamp": 1642962902095,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/traffic-manager-application-gateway-demo-setup/nested/azuredeploywebserver.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT835",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT835",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "User name for the Web Server VM."
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Web Server VM."
+ }
+ },
+ "dnsNameForPublicIP": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Globally unique DNS Name for the Public IP used to access the Web Server VM."
+ }
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "14.04.5-LTS",
+ "allowedValues": [
+ "14.04.5-LTS",
+ "16.04.0-LTS"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the Web Server VM. Allowed values: 14.04.5-LTS, 16.04.0-LTS"
+ }
+ },
+ "testPage": {
+ "type": "string",
+ "defaultValue": "index.html",
+ "metadata": {
+ "description": "Test page you want to create on the Web Server."
+ }
+ },
+ "testPageTitle": {
+ "type": "string",
+ "defaultValue": "Test Page",
+ "metadata": {
+ "description": "Test page title."
+ }
+ },
+ "testPageBody": {
+ "type": "string",
+ "defaultValue": "This is a test page.
",
+ "metadata": {
+ "description": "Test page content body markup."
+ }
+ },
+ "installPHP": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Set to True to install PHP."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of resources"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "allowedValues": [
+ "Standard_D2s_v3"
+ ],
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "VM Size"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ }
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "[concat('webtestnic-', parameters('dnsNameForPublicIP'), '-', uniqueString(resourceGroup().id))]",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "vhdStorageType": "Standard_LRS",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "[concat('webtestvm-', parameters('dnsNameForPublicIP'), '-', uniqueString(resourceGroup().id))]",
+ "virtualNetworkName": "[concat('webtestvnet-', uniqueString(resourceGroup().id, parameters('dnsNameForPublicIP')))]",
+ "subnetRef": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]",
+ "vhdStorageName": "[concat('webtestvhd', uniqueString(resourceGroup().id, parameters('dnsNameForPublicIP')))]",
+ "singleQuote": "'",
+ "frontEndNSGName": "[concat('webtestnsg-', uniqueString(resourceGroup().id, parameters('dnsNameForPublicIP')))]",
+ "testPageMarkup": "Test PageThis is a test page.
"
+ },
+ "outputs": {
+ "fqdn": {
+ "type": "string",
+ "value": "[reference(parameters('dnsNameForPublicIP')).dnsSettings.fqdn]"
+ },
+ "ipId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('dnsNameForPublicIP'))]"
+ },
+ "pageContent": {
+ "type": "string",
+ "value": "[variables('testPageMarkup')]"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('vhdStorageName')]",
+ "apiVersion": "2021-01-01",
+ "location": "location",
+ "tags": {
+ "displayName": "StorageAccount"
+ },
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "dnsNameForPublicIP",
+ "location": "location",
+ "tags": {
+ "displayName": "PublicIPAddress"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNameForPublicIP"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "[variables('virtualNetworkName')]",
+ "location": "location",
+ "tags": {
+ "displayName": "VirtualNetwork"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('frontEndNSGName')]",
+ "location": "location",
+ "tags": {
+ "displayName": "NSG - Web Server"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh-rule",
+ "properties": {
+ "description": "Allow SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "web-rule",
+ "properties": {
+ "description": "Allow Web",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[variables('nicName')]",
+ "location": "location",
+ "tags": {
+ "displayName": "NetworkInterface"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/publicIPAddresses/', parameters('dnsNameForPublicIP'))]",
+ "[resourceId('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
+ "[resourceId('Microsoft.Network/networkSecurityGroups/', variables('frontEndNSGName'))]"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dnsNameForPublicIP"
+ },
+ "subnet": {
+ "id": "[variables('subnetRef')]"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('frontEndNSGName'))]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "[variables('vmName')]",
+ "location": "location",
+ "tags": {
+ "displayName": "VirtualMachine"
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('vhdStorageName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "[variables('vmName')]",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[concat(variables('vmName'),'_OSDisk')]",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "PrepareServer",
+ "type": "extensions",
+ "location": "location",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
+ ],
+ "tags": {
+ "displayName": "PrepareServer"
+ },
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/prepwebserver.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('sh prepwebserver.sh', ' ', string(parameters('installPHP')), ' ', variables('singleQuote'), variables('testPageMarkup'), variables('singleQuote'), ' ', parameters('testPage'), ' ', variables('singleQuote'), parameters('ubuntuOSVersion'), variables('singleQuote'))]"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT838 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT838
new file mode 100644
index 0000000..9214cde
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT838
@@ -0,0 +1,333 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/traffic-manager-demo-setup/nested/azuredeploywebserver.json"
+ ],
+ "timestamp": 1642962902124,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/traffic-manager-demo-setup/nested/azuredeploywebserver.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT838",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT838",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "User name for the Web Server VM."
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Web Server VM."
+ }
+ },
+ "dnsNameForPublicIP": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Globally unique DNS Name for the Public IP used to access the Web Server VM."
+ }
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "14.04.5-LTS",
+ "allowedValues": [
+ "14.04.5-LTS",
+ "16.04.0-LTS"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the Web Server VM. Allowed values: 14.04.5-LTS, 16.04.0-LTS"
+ }
+ },
+ "testPage": {
+ "type": "string",
+ "defaultValue": "index.html",
+ "metadata": {
+ "description": "Test page you want to create on the Web Server."
+ }
+ },
+ "testPageTitle": {
+ "type": "string",
+ "defaultValue": "Test Page",
+ "metadata": {
+ "description": "Test page title."
+ }
+ },
+ "testPageBody": {
+ "type": "string",
+ "defaultValue": "This is a test page.
",
+ "metadata": {
+ "description": "Test page content body markup."
+ }
+ },
+ "installPHP": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Set to True to install PHP."
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location of resources"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located."
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "vmSize": {
+ "type": "string"
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "webtestnic-dnsNameForPublicIP",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "default",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "webtestvm-dnsNameForPublicIP",
+ "virtualNetworkName": "webtestvnet-dnsNameForPublicIP",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/webtestvnet-dnsNameForPublicIP/default",
+ "singleQuote": "'",
+ "frontEndNSGName": "webtestnsg-dnsNameForPublicIP",
+ "testPageMarkup": "Test PageThis is a test page.
",
+ "scriptFolder": "scripts",
+ "serverPrepareScriptFileName": "prepwebserver.sh"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "dnsNameForPublicIP",
+ "location": "location",
+ "tags": {
+ "displayName": "PublicIPAddress"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNameForPublicIP"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "webtestvnet-dnsNameForPublicIP",
+ "location": "location",
+ "tags": {
+ "displayName": "VirtualNetwork"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "default",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "webtestnsg-dnsNameForPublicIP",
+ "location": "location",
+ "tags": {
+ "displayName": "NSG - Web Server"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh-rule",
+ "properties": {
+ "description": "Allow SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "web-rule",
+ "properties": {
+ "description": "Allow Web",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "webtestnic-dnsNameForPublicIP",
+ "location": "location",
+ "tags": {
+ "displayName": "NetworkInterface"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/dnsNameForPublicIP",
+ "Microsoft.Network/virtualNetworks/webtestvnet-dnsNameForPublicIP",
+ "Microsoft.Network/networkSecurityGroups/webtestnsg-dnsNameForPublicIP"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dnsNameForPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/webtestvnet-dnsNameForPublicIP/default"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/webtestnsg-dnsNameForPublicIP"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "webtestvm-dnsNameForPublicIP",
+ "location": "location",
+ "tags": {
+ "displayName": "VirtualMachine"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/webtestnic-dnsNameForPublicIP"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "webtestvm-dnsNameForPublicIP",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/webtestnic-dnsNameForPublicIP"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "PrepareServer",
+ "type": "extensions",
+ "location": "location",
+ "apiVersion": "2019-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/webtestvm-dnsNameForPublicIP"
+ ],
+ "tags": {
+ "displayName": "PrepareServer"
+ },
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('scriptFolder'), '/', variables('serverPrepareScriptFileName'), parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "[concat('sh prepwebserver.sh', ' ', string(parameters('installPHP')), ' ', variables('singleQuote'), variables('testPageMarkup'), variables('singleQuote'), ' ', parameters('testPage'), ' ', variables('singleQuote'), parameters('ubuntuOSVersion'), variables('singleQuote'))]"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "fqdn": {
+ "type": "string",
+ "value": "[reference(parameters('dnsNameForPublicIP')).dnsSettings.fqdn]"
+ },
+ "ipId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('dnsNameForPublicIP'))]"
+ },
+ "pageContent": {
+ "type": "string",
+ "value": "[variables('testPageMarkup')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT84 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT84
new file mode 100644
index 0000000..5512117
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT84
@@ -0,0 +1,160 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/setup-cloudera.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885767,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/setup-cloudera.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT84",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT84",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "vmSpec": {
+ "type": "object"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "fqdn": {
+ "type": "string"
+ },
+ "cmUsername": {
+ "type": "string"
+ },
+ "cmPassword": {
+ "type": "securestring",
+ "value": "GEN-PASSWORD"
+ },
+ "company": {
+ "type": "string",
+ "value": "company"
+ },
+ "emailAddress": {
+ "type": "string",
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "type": "string",
+ "value": "123456789"
+ },
+ "firstName": {
+ "type": "string",
+ "value": "FirstName"
+ },
+ "lastName": {
+ "type": "string",
+ "value": "LastName"
+ },
+ "jobRole": {
+ "type": "string",
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "type": "string",
+ "value": "Storage"
+ },
+ "installCDH": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ }
+ },
+ "variables": {
+ "singleQuote": "'",
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-10-mn0/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/bootstrap-cloudera.sh",
+ "scriptsUri/scripts/initialize-cloudera-server.sh",
+ "scriptsUri/scripts/cmxDeployOnIbiza.py",
+ "scriptsUri/scripts/install-postgresql.sh"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "sh bootstrap-cloudera.sh 'networkSpec' 'networkSpec' 'GEN-UNIQUE-10' 'fqdn' 'clusterSpec' 'clusterSpec' 'vmSpec' 'clusterSpec' 'vmSpec' 'cmUsername' 'GEN-PASSWORD' 'email@yourcompany.com' '123456789' 'FirstName' 'LastName' 'Administrator' 'Storage' 'company' 'installCDH' 'vmSpec' >> /var/log/cloudera-azure-initialize.log 2>&1"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT841 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT841
new file mode 100644
index 0000000..a681adb
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT841
@@ -0,0 +1,357 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/two-tier-nodejsapp-migration-to-containers-on-azure/azuredeploy.json",
+ "/demos/two-tier-nodejsapp-migration-to-containers-on-azure/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902151,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/two-tier-nodejsapp-migration-to-containers-on-azure/azuredeploy.json",
+ "/demos/two-tier-nodejsapp-migration-to-containers-on-azure/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT841",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT841",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "virtualMachineName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "appGitLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The Git Url of the app"
+ },
+ "defaultValue": "https://github.com/evillgenius75/gbb-todo"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_F1",
+ "metadata": {
+ "description": "Default VM Size"
+ }
+ }
+ },
+ "variables": {
+ "nicName": "nicCard",
+ "publicIPAddressName": "publicIP",
+ "publicIPAddressType": "Dynamic",
+ "nsgName": "nsg",
+ "virtualNetworkName": "vnet",
+ "newStorageAccountName": "[concat('storage',uniqueString(resourceGroup().id))]",
+ "dnsNameForPublicIP": "[concat('pip',uniqueString(resourceGroup().id))]",
+ "customExtensionScriptFileName": "mongo_nodejs.sh",
+ "todoAppTags": {
+ "provider": "NA"
+ },
+ "quickstartTags": {
+ "name": "todoApp"
+ },
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('newStorageAccountName')]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Storage Account",
+ "quickstartName": "(quickstartTags).name",
+ "provider": "(todoAppTags).provider"
+ },
+ "kind": "Storage",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIP",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Public IP",
+ "quickstartName": "(quickstartTags).name",
+ "provider": "(todoAppTags).provider"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[variables('dnsNameForPublicIP')]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "nsg",
+ "apiVersion": "2020-07-01",
+ "location": "[resourceGroup().location]",
+ "comments": "NSG for Subnet",
+ "tags": {
+ "displayName": "Network Security Group",
+ "quickstartName": "(quickstartTags).name",
+ "provider": "(todoAppTags).provider"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH-allow",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "10.0.0.0/16",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Nodejs-allow",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8080",
+ "destinationAddressPrefix": "10.0.0.0/16",
+ "sourceAddressPrefix": "Internet",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "vnet",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups//nsg"
+ ],
+ "tags": {
+ "displayName": "Virtual Network",
+ "quickstartName": "(quickstartTags).name",
+ "provider": "(todoAppTags).provider"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicCard",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//publicIP",
+ "Microsoft.Network/virtualNetworks//vnet"
+ ],
+ "tags": {
+ "displayName": "Network Interface Card",
+ "quickstartName": "(quickstartTags).name",
+ "provider": "(todoAppTags).provider"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//vnet/subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GEN-UNIQUE-10",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('newStorageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
+ ],
+ "tags": {
+ "displayName": "Virtual Machine",
+ "quickstartName": "(quickstartTags).name",
+ "provider": "(todoAppTags).provider"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_F1"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE-10",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04.0-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "GEN-UNIQUE-10_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicCard"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "customExtension",
+ "type": "extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE-10"
+ ],
+ "tags": {
+ "displayName": "customExtension"
+ },
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'),concat('scripts/',variables('customExtensionScriptFileName'), parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sh mongo_nodejs.sh https://github.com/evillgenius75/gbb-todo"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "adminUsername": {
+ "type": "string",
+ "value": "[parameters('adminUsername')]"
+ },
+ "publicIP": {
+ "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))).dnsSettings.fqdn]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT842 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT842
new file mode 100644
index 0000000..10b30ea
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT842
@@ -0,0 +1,357 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ubuntu-desktop-gnome/azuredeploy.json",
+ "/demos/ubuntu-desktop-gnome/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902157,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ubuntu-desktop-gnome/azuredeploy.json",
+ "/demos/ubuntu-desktop-gnome/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT842",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT842",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name Prefix for the Storage Account where the Virtual Machine's disks will be placed. StorageAccounts may contain at most variables('vmsPerStorageAccount')"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "dnsNameForPublicIP": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "The VM role size of the jump box"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "vmName": "jumpbox",
+ "availabilitySetNodes": "avail-set",
+ "osImagePublisher": "Canonical",
+ "osImageOffer": "UbuntuServer",
+ "osImageSKU": "18.04-LTS",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "customScriptLocation": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/ubuntu-desktop-gnome/",
+ "wgetCommandPrefix": "wget --tries 20 --retry-connrefused --waitretry=15 -qO- https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/ubuntu-desktop-gnome/configure-ubuntu.sh | nohup /bin/bash -s ",
+ "wgetCommandPostfix": " > /var/log/azure/firstinstall.log 2>&1 &'",
+ "commandPrefix": "/bin/bash -c '",
+ "virtualNetworkName": "VNET",
+ "subnetName": "Subnet",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/24",
+ "nsgName": "node-nsg",
+ "nsgID": "Microsoft.Network/networkSecurityGroups/node-nsg",
+ "storageAccountType": "Standard_LRS",
+ "nodesLbName": "nodeslb",
+ "nodesLbBackendPoolName": "node-pool",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE-8/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2019-06-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "avail-set",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "VNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/node-nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/node-nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "node-nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh",
+ "properties": {
+ "description": "SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "jumpbox-nic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers//nodeslb",
+ "Microsoft.Network/virtualNetworks//VNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipConfigNode",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(split(variables('subnetPrefix'),'0/24')[0], '100')]",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/VNET/Subnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/nodeslb/node-pool"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/nodeslb/SSH-jumpbox"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "name": "nodeslb",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "NodesLBFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "node-pool"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "SSH-jumpbox",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/nodeslb/NodesLBFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 22,
+ "backendPort": 22,
+ "enableFloatingIP": false
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "jumpbox",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE",
+ "Microsoft.Network/networkInterfaces//jumpbox-nic",
+ "Microsoft.Compute/availabilitySets//avail-set"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/avail-set"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "jumpbox",
+ "adminUsername": "GEN-UNIQUE-8",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "jumpbox_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/jumpbox-nic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "jumpbox/configuremaster",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//jumpbox"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "commandToExecute": "/bin/bash -c 'wget --tries 20 --retry-connrefused --waitretry=15 -qO- https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/ubuntu-desktop-gnome/configure-ubuntu.sh | nohup /bin/bash -s GEN-UNIQUE-8 > /var/log/azure/firstinstall.log 2>&1 &'"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT843 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT843
new file mode 100644
index 0000000..a0ca914
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT843
@@ -0,0 +1,287 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ubuntu-desktop-gnome-rdp/azuredeploy.json",
+ "/demos/ubuntu-desktop-gnome-rdp/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902163,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ubuntu-desktop-gnome-rdp/azuredeploy.json",
+ "/demos/ubuntu-desktop-gnome-rdp/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT843",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT843",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Virtual Machine"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "The size of the virtual machines used when provisioning"
+ }
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "18.04-LTS",
+ "allowedValues": [
+ "18.04-LTS"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values: 12.04.5-LTS, 14.04.5-LTS, 15.10."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "myVMNic",
+ "nsgName": "myNSG",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressName": "myPublicIP",
+ "virtualNetworkName": "MyVNET",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Basic"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/myPublicIP",
+ "Microsoft.Network/virtualNetworks/MyVNET",
+ "Microsoft.Network/networkSecurityGroups/myNSG"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/myNSG"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-08-01",
+ "name": "myNSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "RDP",
+ "properties": {
+ "protocol": "TCP",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 320,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "osType": "Linux",
+ "name": "GEN-UNIQUE_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE/installscript",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('install_xrdp.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "bash install_xrdp.sh"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT844 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT844
new file mode 100644
index 0000000..32634f6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT844
@@ -0,0 +1,312 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ubuntu-desktop-xfce-rdp/azuredeploy.json",
+ "/demos/ubuntu-desktop-xfce-rdp/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902169,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ubuntu-desktop-xfce-rdp/azuredeploy.json",
+ "/demos/ubuntu-desktop-xfce-rdp/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT844",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT844",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Name for the publicly accessible node. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "allowedValues": [
+ "Standard_A1",
+ "Standard_A2",
+ "Standard_A3",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3"
+ ],
+ "metadata": {
+ "description": "The size of the virtual machines used when provisioning"
+ }
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "14.04.5-LTS",
+ "allowedValues": [
+ "12.04.5-LTS",
+ "14.04.5-LTS",
+ "15.10"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values: 12.04.5-LTS, 14.04.5-LTS, 15.10."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyubuntuVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-07-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-22",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ },
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1001,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/myPublicIP",
+ "Microsoft.Network/virtualNetworks/MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyubuntuVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "MyubuntuVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "MyubuntuVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "MyubuntuVM/newuserscript",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/MyubuntuVM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/install_xrdp.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "bash install_xrdp.sh"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT845 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT845
new file mode 100644
index 0000000..a3995b2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT845
@@ -0,0 +1,323 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/ubuntu-netdisk-setup/azuredeploy.json",
+ "/demos/ubuntu-netdisk-setup/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902178,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/ubuntu-netdisk-setup/azuredeploy.json",
+ "/demos/ubuntu-netdisk-setup/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT845",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT845",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sshKeyData": {
+ "type": "string",
+ "metadata": {
+ "description": "Please copy the content of your SSH RSA public key and paste it here. You can use \"ssh-keygen -t rsa -b 2048\" to generate your SSH key pairs."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version."
+ },
+ "value": "16.04-LTS"
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "VM size."
+ },
+ "value": "Standard_D2s_v3"
+ },
+ "adminEmail": {
+ "type": "string",
+ "metadata": {
+ "description": "admin_email is used to login seafile server, i.e. admin@seafile.local"
+ },
+ "value": "test@email.com"
+ },
+ "adminPass": {
+ "type": "securestring",
+ "metadata": {
+ "description": "admin_pass is optional, if you do not specify it, a random string is generated"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation. Leave it blank unless you need to provide your own value."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "myVMNic1",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyUbuntuVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet",
+ "sshKeyPath": "/home/GEN-UNIQUE/.ssh/authorized_keys"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic1",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP",
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/mysg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "mysg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "port80",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ],
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic1"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyUbuntuVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//myVMNic1"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "MyUbuntuVM",
+ "adminUsername": "GEN-UNIQUE",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": 1023,
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "ReadWrite"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic1"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "MyUbuntuVM/CustomScript",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/MyUbuntuVM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('script/install.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "[concat('export TERM=xterm && bash ', 'install.sh -u ', parameters('adminEmail'), ' -d ', reference(variables('publicIPAddressName')).dnsSettings.fqdn, ' -p \"', parameters('adminPass'), '\"')]"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "hostname": {
+ "type": "string",
+ "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
+ },
+ "sshCommand": {
+ "type": "string",
+ "value": "[concat('ssh ', parameters('adminUsername'), '@', reference(variables('publicIPAddressName')).dnsSettings.fqdn)]"
+ },
+ "extensionOutput": {
+ "type": "string",
+ "value": "[reference('Microsoft.Compute/virtualMachines/MyUbuntuVM/extensions/CustomScript').instanceView.statuses[0].message]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT846 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT846
new file mode 100644
index 0000000..356dca1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT846
@@ -0,0 +1,331 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-32-data-disks-high-iops/azuredeploy.json",
+ "/demos/vm-32-data-disks-high-iops/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902186,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-32-data-disks-high-iops/azuredeploy.json",
+ "/demos/vm-32-data-disks-high-iops/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT846",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT846",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The username of the initial account to be created"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password of the initial account to be created"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sizeOfEachDataDiskInGB": {
+ "type": "int",
+ "defaultValue": 1024,
+ "allowedValues": [
+ 32,
+ 64,
+ 128,
+ 256,
+ 512,
+ 1024,
+ 2048,
+ 4095
+ ],
+ "metadata": {
+ "description": "The size of the datadisks to be striped. The total capacity will be this size multiplied by the number of data disks you specify."
+ }
+ },
+ "numberOfDisks": {
+ "type": "int",
+ "defaultValue": 32,
+ "allowedValues": [
+ 8,
+ 16,
+ 32
+ ],
+ "metadata": {
+ "description": "The number of data disks to include in the storage pool."
+ }
+ },
+ "dnsName": {
+ "type": "string",
+ "defaultValue": "[concat('vm-data-disks-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "DNS name for the Public IP"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D16s_v3",
+ "allowedValues": [
+ "Standard_D16s_v3",
+ "Standard_D32s_v3",
+ "Standard_D64s_v3"
+ ],
+ "metadata": {
+ "description": "VM Size, the list of sizes here all support premium and standard storage up to 32 data disks."
+ }
+ },
+ "storageType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "StahdardSSD_LRS",
+ "Standard_LRS"
+ ],
+ "metadata": {
+ "description": "Storage SKU type"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "vmName": "vm-high-iops",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "imageSKU": "2016-Datacenter",
+ "virtualNetworkName": "highIopsVNET",
+ "nicName": "highIopsNIC",
+ "addressPrefix": "10.0.0.0/16",
+ "subnet1Name": "Subnet-1",
+ "subnet1Prefix": "10.0.0.0/24",
+ "publicIPAddressName": "highIopsPubIP",
+ "publicIPAddressType": "Dynamic",
+ "configurationFunction": "StoragePool.ps1\\StoragePool",
+ "modulesUrl": "[uri(parameters('_artifactsLocation'), 'DSC/StoragePool.zip')]",
+ "DscExtensionName": "DscExtension",
+ "subnet1Ref": "Microsoft.Network/virtualNetworks/subnets/highIopsVNET/Subnet-1",
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "highIopsPubIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[concat('vm-data-disks-', uniqueString(resourceGroup().id))]"
+ }
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-08-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2018-04-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "highIopsVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2018-04-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "highIopsNIC",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "highIopsPubIP",
+ "highIopsVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/highIopsPubIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/highIopsVNET/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vm-high-iops",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "highIopsNIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D16s_v3"
+ },
+ "osProfile": {
+ "computerName": "vm-high-iops",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ },
+ "copy": [
+ {
+ "name": "dataDisks",
+ "count": 32,
+ "input": {
+ "diskSizeGB": 1024,
+ "lun": "[copyIndex('dataDisks')]",
+ "name": "[concat(variables('vmName'), '_DataDisk', copyIndex('dataDisks'))]",
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/highIopsNIC"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vm-high-iops/DscExtension",
+ "apiVersion": "2017-03-30",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "vm-high-iops"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), 'DSC/StoragePool.zip')]",
+ "SasToken": "",
+ "ConfigurationFunction": "StoragePool.ps1\\StoragePool",
+ "Properties": {
+ "MachineName": "vm-high-iops"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "fqdn": {
+ "type": "string",
+ "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT847 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT847
new file mode 100644
index 0000000..7c578c0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT847
@@ -0,0 +1,321 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-cpu-sysbench-meter/azuredeploy.json",
+ "/demos/vm-cpu-sysbench-meter/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902193,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-cpu-sysbench-meter/azuredeploy.json",
+ "/demos/vm-cpu-sysbench-meter/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT847",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT847",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size of the VM that runs the test."
+ }
+ },
+ "maxPrimeNumberForTest": {
+ "type": "int",
+ "defaultValue": 20000,
+ "metadata": {
+ "description": "Limit for for prime number test."
+ }
+ },
+ "threadsToRunTest": {
+ "type": "int",
+ "defaultValue": 4,
+ "minValue": 1,
+ "maxValue": 100,
+ "metadata": {
+ "description": "Number of threads for the test to run."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the test VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "osVersion": "14.04.5-LTS",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "testVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressName": "publicIP",
+ "virtualNetworkName": "testVNET",
+ "vhdStorageAccountName": "[concat(uniqueString(resourceGroup().id), 'storage')]",
+ "frontEndNSGName": "[concat('webtestnsg-', uniqueString(resourceGroup().id))]",
+ "vmName": "testVM",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('vhdStorageAccountName')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "testVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "testVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "publicIP",
+ "testVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/testVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('frontEndNSGName')]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "NSG"
+ },
+ "dependsOn": [
+ "publicIP"
+ ],
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh-rule",
+ "properties": {
+ "description": "Allow SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "testVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[variables('vhdStorageAccountName')]",
+ "[variables('nicName')]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "testVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.5-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "testVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/testVMNic"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "extensions",
+ "name": "CustomScriptExtension",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "testVM"
+ ],
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "CustomScriptForLinux",
+ "typeHandlerVersion": "1.5",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/cputest.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sudo bash cputest.sh 4 20000"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "totaltime": {
+ "type": "string",
+ "value": "[split(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2], ' ')[0]]"
+ },
+ "perrequestmin": {
+ "type": "string",
+ "value": "[split(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2], ' ')[1]]"
+ },
+ "perrequestavg": {
+ "type": "string",
+ "value": "[split(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2], ' ')[2]]"
+ },
+ "perrequestmax": {
+ "type": "string",
+ "value": "[split(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2], ' ')[3]]"
+ },
+ "perrequest95percentile": {
+ "type": "string",
+ "value": "[split(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2], ' ')[4]]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT848 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT848
new file mode 100644
index 0000000..fbed064
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT848
@@ -0,0 +1,257 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-cse-msi/azuredeploy.json",
+ "/demos/vm-cse-msi/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902201,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-cse-msi/azuredeploy.json",
+ "/demos/vm-cse-msi/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT848",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT848",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.451.19169",
+ "templateHash": "4363912042809833013"
+ }
+ },
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "secureString",
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A4_v2",
+ "metadata": {
+ "description": "Size of the virtual machine"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "fileUris": {
+ "type": "array",
+ "metadata": {
+ "description": "An array of fileUris to download via the custom script extension"
+ },
+ "value": "GEN-PRIVATE-STORAGE-ARTIFACTS"
+ },
+ "identityName": {
+ "type": "string",
+ "metadata": {
+ "description": "name for the managedIdenity to use for custom script download, the principal must have at least storage blob reader permission on the storage account, roleDef: 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
+ },
+ "value": "GEN-USER-ASSIGNED-IDENTITY-NAME"
+ },
+ "identityResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "resourceGroup for the managedIdenity to use for custom script download"
+ },
+ "value": "GEN-USER-ASSIGNED-IDENTITY-RESOURCEGROUP-NAME"
+ },
+ "alwaysRun": {
+ "type": "string",
+ "defaultValue": "[newGuid()]",
+ "metadata": {
+ "description": "For the sample, use this to ensure the extension will always execute."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "windowsOSVersion": "2019-Datacenter",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyWindowsVM",
+ "virtualNetworkName": "MyVNET"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2021-02-01",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2021-02-01",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2021-02-01",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/myPublicIP"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2021-04-01",
+ "name": "MyWindowsVM",
+ "location": "[resourceGroup().location]",
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('identityResourceGroup')), 'Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identityName'))]": {}
+ }
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A4_v2"
+ },
+ "osProfile": {
+ "computerName": "MyWindowsVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/myVMNic"
+ ]
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "apiVersion": "2021-04-01",
+ "name": "[format('{0}/{1}', variables('vmName'), 'cse')]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.10",
+ "autoUpgradeMinorVersion": true,
+ "forceUpdateTag": "[newGuid()]",
+ "settings": {
+ "fileUris": "GEN-PRIVATE-STORAGE-ARTIFACTS",
+ "commandToExecute": "powershell -Command \"ls\""
+ },
+ "protectedSettings": {
+ "managedIdentity": {
+ "object": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('identityResourceGroup')), 'Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identityName')), '2018-11-30').principalId]"
+ }
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/MyWindowsVM"
+ ]
+ }
+ ],
+ "outputs": {
+ "msiObjectId": {
+ "type": "string",
+ "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('identityResourceGroup')), 'Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identityName')), '2018-11-30').principalId]"
+ },
+ "instanceView": {
+ "type": "object",
+ "value": "[reference(resourceId('Microsoft.Compute/virtualMachines/extensions', variables('vmName'), 'cse')).instanceView]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT849 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT849
new file mode 100644
index 0000000..8a69f30
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT849
@@ -0,0 +1,379 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-disk-performance-meter/azuredeploy.json",
+ "/demos/vm-disk-performance-meter/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902209,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-disk-performance-meter/azuredeploy.json",
+ "/demos/vm-disk-performance-meter/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT849",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT849",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size of the VM that runs the test."
+ }
+ },
+ "dataDiskStorageAccountType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Premium_LRS",
+ "StandardSSD_LRS",
+ "UltraSSD_LRS"
+ ],
+ "metadata": {
+ "description": "Storage Account type for the test disk"
+ }
+ },
+ "dataDiskHostCaching": {
+ "type": "string",
+ "defaultValue": "ReadOnly",
+ "allowedValues": [
+ "None",
+ "ReadOnly",
+ "ReadWrite"
+ ],
+ "metadata": {
+ "description": "Data disk caching type for the test disk"
+ }
+ },
+ "testType": {
+ "type": "string",
+ "allowedValues": [
+ "read",
+ "write",
+ "randread",
+ "randwrite",
+ "randtrim",
+ "rw",
+ "readwrite",
+ "randrw"
+ ],
+ "defaultValue": "randread",
+ "metadata": {
+ "description": "Disk test type to run. (rand: random, sequential otherwise; rw - read/write)"
+ }
+ },
+ "testSize": {
+ "type": "string",
+ "allowedValues": [
+ "32m",
+ "64m",
+ "128m",
+ "256m",
+ "512m",
+ "1g",
+ "2g",
+ "10g",
+ "30g"
+ ],
+ "defaultValue": "1g",
+ "metadata": {
+ "description": "Size of the file to test."
+ }
+ },
+ "testBlockSize": {
+ "type": "string",
+ "allowedValues": [
+ "4k",
+ "8k",
+ "16k",
+ "32k",
+ "64k"
+ ],
+ "defaultValue": "8k",
+ "metadata": {
+ "description": "Size of the block to test."
+ }
+ },
+ "secondsToRunTest": {
+ "type": "int",
+ "defaultValue": 30,
+ "metadata": {
+ "description": "Number of seconds for the test to run."
+ }
+ },
+ "threadsToRunTest": {
+ "type": "int",
+ "defaultValue": 4,
+ "minValue": 1,
+ "maxValue": 10,
+ "metadata": {
+ "description": "Number of worker threads for the test to run."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the test VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "password",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-PASSWORD"
+ }
+ },
+ "variables": {
+ "osVersion": "18.04-LTS",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "nicName": "testVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressName": "publicIP",
+ "virtualNetworkName": "testVNET",
+ "scriptFolder": "scripts",
+ "frontEndNSGName": "[concat('webtestnsg-', uniqueString(resourceGroup().id))]",
+ "vmName": "testVM",
+ "testScriptFileName": "disktest.sh",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-PASSWORD"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "testVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "testVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "publicIP",
+ "testVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/testVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('frontEndNSGName')]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "NSG"
+ },
+ "dependsOn": [
+ "publicIP"
+ ],
+ "properties": {
+ "securityRules": [
+ {
+ "name": "ssh-rule",
+ "properties": {
+ "description": "Allow SSH",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "testVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "testVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "testVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "testVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "testVM_DataDisk",
+ "diskSizeGB": 1023,
+ "lun": 0,
+ "caching": "ReadOnly",
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/testVMNic"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "extensions",
+ "name": "CustomScriptExtension",
+ "apiVersion": "2019-12-01",
+ "dependsOn": [
+ "testVM"
+ ],
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "CustomScriptForLinux",
+ "typeHandlerVersion": "1.5",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat(variables('scriptFolder'), '/', variables('testScriptFileName'), parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "sudo bash disktest.sh 1g randread 30 4 8k"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "testresult": {
+ "type": "string",
+ "value": "[trim(split(reference('CustomScriptExtension').instanceView.statuses[0].message, '\n')[2])]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT85 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT85
new file mode 100644
index 0000000..dcd0d26
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT85
@@ -0,0 +1,163 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/shared-resources-existing-vnet.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885784,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/shared-resources-existing-vnet.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT85",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/availabilitysets",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT85",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "masterNodeASName": {
+ "type": "string"
+ },
+ "dataNodeASName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2017-12-01",
+ "name": "masterNodeASName",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2017-12-01",
+ "name": "dataNodeASName",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "networkSpec-sg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT853 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT853
new file mode 100644
index 0000000..aeb4591
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT853
@@ -0,0 +1,419 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-win-iis-app-ssl/azuredeploy.json",
+ "/demos/vm-win-iis-app-ssl/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902254,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-win-iis-app-ssl/azuredeploy.json",
+ "/demos/vm-win-iis-app-ssl/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT853",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT853",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appVMName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the VM name"
+ },
+ "value": " e.g. myTestVM1"
+ },
+ "appVMAdminUserName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the VM admin user name"
+ },
+ "value": " e.g. adminuser "
+ },
+ "appVMAdminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Set this value for the VM admin user password"
+ }
+ },
+ "appVMWindowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "Windows-Server-Technical-Preview"
+ ],
+ "metadata": {
+ "description": "Set this value for the VM Windows OS Version"
+ }
+ },
+ "appPublicIPDnsName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the dns name of the public ip"
+ },
+ "value": " e.g. mytestvmdns"
+ },
+ "appDSCUpdateTagVersion": {
+ "type": "string",
+ "defaultValue": "1.0",
+ "metadata": {
+ "description": "This value must be changed from a previous deployment to ensure the extension will run"
+ }
+ },
+ "appWebPackage": {
+ "type": "string",
+ "defaultValue": "https://computeteststore.blob.core.windows.net/deploypackage/deployPackage.zip?sv=2015-04-05&ss=bfqt&srt=sco&sp=r&se=2099-10-16T02:03:39Z&st=2016-10-15T18:03:39Z&spr=https&sig=aSH6yNPEGPWXk6PxTPzS6fyEXMD1ZYIkI0j5E9Hu5%2Fk%3D",
+ "metadata": {
+ "description": "Set this value for the signed uri to download the deployment package"
+ }
+ },
+ "appVMVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "allowedValues": [
+ "Standard_D2_v3",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D5"
+ ],
+ "metadata": {
+ "description": "Set this value for the VM size"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Auto-generated container in staging storage account to receive post-build staging folder upload"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ }
+ },
+ "vaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "The Azure Key vault where SSL certificates are stored"
+ },
+ "value": " e.g. myKeyVault"
+ },
+ "vaultResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group of the key vault"
+ },
+ "value": " e.g. myKeyVault-rg"
+ },
+ "httpssecretUrlWithVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "full Key Vault Id to the secret that stores the SSL cert"
+ },
+ "value": " e.g. https://mykeyvault.vault.azure.net/secrets/myPfxCert2/11f95456772549a2b6b0ba38bd1b319a"
+ },
+ "httpssecretCaUrlWithVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "full Key Vault Id to the secret that stores the CA cert"
+ },
+ "value": " e.g. https://mykeyvault.vault.azure.net/secrets/myPfxCert2/11f95456772549a2b6b0ba38bd1b319a"
+ },
+ "certificateStore": {
+ "type": "string",
+ "metadata": {
+ "description": "name of the certificate key secret"
+ },
+ "value": " e.g. myPfxCert2"
+ },
+ "certificateDomain": {
+ "type": "string",
+ "metadata": {
+ "description": "name of the domain the certificate is created for"
+ },
+ "value": " e.g. www.mycompany.com for wildcard use *.mycompany.com"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "appVnetPrefix": "10.0.0.0/16",
+ "appVnetSubnet1Name": "FrontEndSubNet",
+ "appVnetSubnet1Prefix": "10.0.0.0/24",
+ "appVnetSubnet2Name": "DatabaseSubNet",
+ "appVnetSubnet2Prefix": "10.0.1.0/24",
+ "appVMImagePublisher": "MicrosoftWindowsServer",
+ "appVMImageOffer": "WindowsServer",
+ "appVMVmSize": "Standard_D2_v3",
+ "appVMVnetID": "Microsoft.Network/virtualNetworks/appVnet",
+ "appVMSubnetRef": "appVMresourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), variables('appVMVnetID'), '/subnets/', variables('appVnetSubnet1Name'))]",
+ "appVMNicName": " e.g. myTestVM1NetworkInterface",
+ "appPublicIPName": "appPublicIP",
+ "appDSCArchiveFolder": "dsc",
+ "appDSCArchiveFileName": "appDSC.zip",
+ "appDSCSqlArchiveFolder": "dsc",
+ "appDSCSqlArchiveFileName": "appDSCSql.zip"
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "appNetworkSecurityGroup",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "webrule",
+ "properties": {
+ "description": "This rule allows traffic in on port 80",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "INTERNET",
+ "destinationAddressPrefix": "10.0.0.0/24",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "httpsrule",
+ "properties": {
+ "description": "This rule allows traffic in on port 443",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "INTERNET",
+ "destinationAddressPrefix": "10.0.0.0/24",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "rdprule",
+ "properties": {
+ "description": "This rule allows traffic on port 3389 from the web",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "INTERNET",
+ "destinationAddressPrefix": "10.0.0.0/24",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "appVnet",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/appNetworkSecurityGroup"
+ ],
+ "tags": {
+ "displayName": "appVnet"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "FrontEndSubNet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/appNetworkSecurityGroup"
+ }
+ }
+ },
+ {
+ "name": "DatabaseSubNet",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": " e.g. myTestVM1NetworkInterface",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/appVnet",
+ "Microsoft.Network/publicIPAddresses/appPublicIP"
+ ],
+ "tags": {
+ "displayName": "appVMNic"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "appVMresourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), variables('appVMVnetID'), '/subnets/', variables('appVnetSubnet1Name'))]"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/appPublicIP"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": " e.g. myTestVM1",
+ "type": "Microsoft.Compute/virtualMachines",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2017-03-30",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/ e.g. myTestVM1NetworkInterface"
+ ],
+ "tags": {
+ "displayName": "appVM"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": " e.g. myTestVM1",
+ "adminUsername": "appVMAdminUsername",
+ "adminPassword": "appVMAdminPassword",
+ "secrets": [
+ {
+ "sourceVault": {
+ "id": " e.g. myKeyVault-rg/Microsoft.KeyVault/vaults/ e.g. myKeyVault"
+ },
+ "vaultCertificates": [
+ {
+ "certificateUrl": " e.g. https://mykeyvault.vault.azure.net/secrets/myPfxCert2/11f95456772549a2b6b0ba38bd1b319a",
+ "certificateStore": " e.g. myPfxCert2"
+ }
+ ]
+ }
+ ]
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": " e.g. myTestVM1_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/ e.g. myTestVM1NetworkInterface"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "Microsoft.Powershell.DSC",
+ "type": "extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/ e.g. myTestVM1"
+ ],
+ "tags": {
+ "displayName": "appDSC"
+ },
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.9",
+ "autoUpgradeMinorVersion": true,
+ "forceUpdateTag": "1.0",
+ "settings": {
+ "configuration": {
+ "url": "_artifactsLocation/dsc/appDSC.zip",
+ "script": "appDSC.ps1",
+ "function": "Main"
+ },
+ "configurationArguments": {
+ "nodeName": " e.g. myTestVM1",
+ "webDeployPackage": "https://computeteststore.blob.core.windows.net/deploypackage/deployPackage.zip?sv=2015-04-05&ss=bfqt&srt=sco&sp=r&se=2099-10-16T02:03:39Z&st=2016-10-15T18:03:39Z&spr=https&sig=aSH6yNPEGPWXk6PxTPzS6fyEXMD1ZYIkI0j5E9Hu5%2Fk%3D",
+ "certStoreName": " e.g. myPfxCert2",
+ "certDomain": " e.g. www.mycompany.com for wildcard use *.mycompany.com"
+ }
+ },
+ "protectedSettings": {
+ "configurationUrlSasToken": "_artifactsLocationSasToken"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "appPublicIP",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [],
+ "tags": {
+ "displayName": "appPublicIP"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": " e.g. mytestvmdns"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT854 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT854
new file mode 100644
index 0000000..83f4bc4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT854
@@ -0,0 +1,283 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-winrm-keyvault-windows/azuredeploy.json",
+ "/demos/vm-winrm-keyvault-windows/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902262,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-winrm-keyvault-windows/azuredeploy.json",
+ "/demos/vm-winrm-keyvault-windows/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT854",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT854",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "dnsNameForPublicIP": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Name for the Public IP. Must be lowercase."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Default location"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A2_v2",
+ "metadata": {
+ "description": "Size of the VM"
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "WinRmVm",
+ "metadata": {
+ "description": "Name of the VM"
+ }
+ },
+ "vaultResourceId": {
+ "type": "string",
+ "metadata": {
+ "description": "ResourceId of the KeyVault"
+ },
+ "value": "GEN-KEYVAULT-RESOURCE-ID"
+ },
+ "certificateUrl": {
+ "type": "string",
+ "value": "GEN-SF-CERT-URL"
+ }
+ },
+ "variables": {
+ "addressPrefix": "10.0.0.0/16",
+ "subnet1Name": "Subnet-1",
+ "subnet1Prefix": "10.0.0.0/24",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "virtualNetworkName": "myVNET",
+ "nicName": "myNIC",
+ "subnet1Ref": "Microsoft.Network/virtualNetworks/subnets/myVNET/Subnet-1",
+ "networkSecurityGroupName": "Subnet-1-nsg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-08-01",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "comments": "Simple Network Security Group for subnet [variables('subnet1Name')]",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-08-01",
+ "name": "Subnet-1-nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2017-09-01",
+ "name": "myVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/Subnet-1-nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/Subnet-1-nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-09-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myNIC",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "myPublicIP",
+ "myVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVNET/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2019-07-01",
+ "name": "WinRmVm",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "myNIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2_v2"
+ },
+ "osProfile": {
+ "computerName": "WinRmVm",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "secrets": [
+ {
+ "sourceVault": {
+ "id": "GEN-KEYVAULT-RESOURCE-ID"
+ },
+ "vaultCertificates": [
+ {
+ "certificateUrl": "GEN-SF-CERT-URL",
+ "certificateStore": "My"
+ }
+ ]
+ }
+ ],
+ "windowsConfiguration": {
+ "provisionVMAgent": true,
+ "winRM": {
+ "listeners": [
+ {
+ "protocol": "Http"
+ },
+ {
+ "protocol": "Https",
+ "certificateUrl": "GEN-SF-CERT-URL"
+ }
+ ]
+ },
+ "enableAutomaticUpdates": true
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myNIC"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT855 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT855
new file mode 100644
index 0000000..7db92c7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT855
@@ -0,0 +1,568 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-winrm-lb-windows/azuredeploy.json",
+ "/demos/vm-winrm-lb-windows/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902271,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-winrm-lb-windows/azuredeploy.json",
+ "/demos/vm-winrm-lb-windows/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT855",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT855",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "PrimaryVmNamePrefix": {
+ "type": "string",
+ "defaultValue": "myVM",
+ "metadata": {
+ "description": "Virtual machine name prefix for primary vm instances"
+ }
+ },
+ "SecondaryVmNamePrefix": {
+ "type": "string",
+ "defaultValue": "mytestVM",
+ "metadata": {
+ "description": "Virtual machine name prefix for secondary vm instances"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "allowedValues": [
+ "2012-Datacenter",
+ "2012-R2-Datacenter"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2012-Datacenter, 2012-R2-Datacenter."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "allowedValues": [
+ "Standard_A0",
+ "Standard_A1",
+ "Standard_A2",
+ "Standard_A3",
+ "Standard_A4"
+ ],
+ "metadata": {
+ "description": "Virtual machine size"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "location"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "availabilitySetName": "myAvSet",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet-1",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressType": "Dynamic",
+ "vnetName": "myVNET",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressID": "Microsoft.Network/publicIPAddresses/myPublicIP",
+ "lbName": "myLB",
+ "numberOfInstances": 1,
+ "hostDNSNameScriptArgument": "*.[resourceGroup().location].cloudapp.azure.com",
+ "primaryNicNamePrefix": "nic",
+ "secondaryNicNamePrefix": "nicN",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myAvSet",
+ "apiVersion": "2020-12-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-13"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "myVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "niccopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//myVNET",
+ "Microsoft.Network/loadBalancers//myLB"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVNET/variables (subnetName)"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools//myLB/LoadBalancerBackend"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/myLB/PRDP-VMcopyindex()"
+ },
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/myLB/PWINRM-VMcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicNcopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 1
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//myVNET",
+ "Microsoft.Network/loadBalancers//myLB"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig2",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVNET/variables (subnetName)"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools//myLB/LoadBalancerBackend"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/myLB/SRDP-VMcopyindex()"
+ },
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/myLB/SWINRM-VMcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "myLB",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontend",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LoadBalancerBackend"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "PRDP-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50001,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "PRDP-VM1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50002,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "PWINRM-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 40001,
+ "backendPort": 5986,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "PWINRM-VM1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 40002,
+ "backendPort": 5986,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "SRDP-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50003,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "SRDP-VM1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50004,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "SWINRM-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 40003,
+ "backendPort": 5986,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "SWINRM-VM1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 40004,
+ "backendPort": 5986,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "LBRule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools//myLB/LoadBalancerBackend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 5,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes//myLB/tcpProbe"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "tcpProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "primaryVmNamePrefixcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 1
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//niccopyindex()",
+ "Microsoft.Compute/availabilitySets//myAvSet"
+ ],
+ "tags": {
+ "Role": "Web"
+ },
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "primaryVmNamePrefixcopyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/niccopyindex()"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "primaryVmNamePrefixcopyIndex()/WinRMCustomScriptExtension",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/primaryVmNamePrefixcopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.4",
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('ConfigureWinRM.ps1', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('makecert.exe', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('winrmconf.cmd', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -file ConfigureWinRM.ps1 *.[resourceGroup().location].cloudapp.azure.com"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "secondaryVmNamePrefixcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 1
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nicNcopyindex()",
+ "Microsoft.Compute/availabilitySets//myAvSet"
+ ],
+ "tags": {
+ "Role": "Test"
+ },
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "secondaryVmNamePrefixcopyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicNcopyindex()"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "secondaryVmNamePrefixcopyindex()/WinRMCustomScriptExtension",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/secondaryVmNamePrefixcopyindex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.4",
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('ConfigureWinRM.ps1', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('makecert.exe', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('winrmconf.cmd', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -file ConfigureWinRM.ps1 *.[resourceGroup().location].cloudapp.azure.com"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT856 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT856
new file mode 100644
index 0000000..ff98758
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT856
@@ -0,0 +1,309 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vm-winrm-windows/azuredeploy.json",
+ "/demos/vm-winrm-windows/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902280,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vm-winrm-windows/azuredeploy.json",
+ "/demos/vm-winrm-windows/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT856",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT856",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "yourusername"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Password for the Virtual Machine."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE-13"
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
+ }
+ },
+ "vmName": {
+ "type": "string",
+ "defaultValue": "MyVM",
+ "metadata": {
+ "description": "The name for the VM."
+ },
+ "value": "MyVM"
+ },
+ "nicName": {
+ "type": "string",
+ "defaultValue": "myVMNic",
+ "metadata": {
+ "description": "The name for the VM's NIC."
+ },
+ "value": "myVMNic"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "MyVNET",
+ "metadata": {
+ "description": "The name for the VM's VNET."
+ },
+ "value": "MyVNET"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A2",
+ "metadata": {
+ "description": "The size of the VM"
+ }
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "defaultValue": "myPublicIP",
+ "metadata": {
+ "description": "The name for the VM's public IP."
+ },
+ "value": "myPublicIP"
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "Subnet",
+ "metadata": {
+ "description": "The name for the VM's Subnet."
+ },
+ "value": "Subnet"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmName": "MyVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet",
+ "hostDNSNameScriptArgument": "*.[resourceGroup().location].cloudapp.azure.com",
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-13"
+ }
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2021-03-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-03-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP",
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A2"
+ },
+ "osProfile": {
+ "computerName": "MyVM",
+ "adminUsername": "yourusername",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-07-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "MyVM/WinRMCustomScriptExtension",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//MyVM"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "typeHandlerVersion": "1.4",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('ConfigureWinRM.ps1', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('makecert.exe', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -file ConfigureWinRM.ps1 *.[resourceGroup().location].cloudapp.azure.com"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT857 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT857
new file mode 100644
index 0000000..b3ec768
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT857
@@ -0,0 +1,307 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmaccess-on-ubuntu/azuredeploy.json",
+ "/demos/vmaccess-on-ubuntu/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902288,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmaccess-on-ubuntu/azuredeploy.json",
+ "/demos/vmaccess-on-ubuntu/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT857",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT857",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Storage Account where the Virtual Machine's disks will be placed."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the vm, will be used as DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "VM size"
+ },
+ "value": "Standard_D2_v3"
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "16.04-LTS",
+ "metadata": {
+ "description": "The Ubuntu version"
+ },
+ "value": "16.04-LTS"
+ },
+ "userName": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name whose password you want to change"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "password": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The new password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sshKey": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The new public key"
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "resetSSH": {
+ "type": "bool",
+ "defaultValue": false,
+ "allowedValues": [
+ true,
+ false
+ ],
+ "metadata": {
+ "description": "Whether to reset ssh"
+ },
+ "value": false
+ },
+ "userNameToRemove": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The user name you want to remove"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "virtualNetworkName": "vnet-vmaccess",
+ "nicName": "GEN-UNIQUE",
+ "publicIPAddressName": "GEN-UNIQUE",
+ "vnetAddressPrefix": "10.0.0.0/16",
+ "subnetName": "VMAccess",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressType": "Dynamic",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/vnet-vmaccess/VMAccess",
+ "storageAccountType": "Standard_LRS",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "vnet-vmaccess",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "VMAccess",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//GEN-UNIQUE",
+ "Microsoft.Network/virtualNetworks//vnet-vmaccess"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vnet-vmaccess/VMAccess"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE",
+ "Microsoft.Network/networkInterfaces//GEN-UNIQUE"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "GEN-UNIQUE",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(parameters('newStorageAccountName'),'2015-06-15').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE/enablevmaccess",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//GEN-UNIQUE"
+ ],
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "VMAccessForLinux",
+ "typeHandlerVersion": "1.4",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "username": "GEN-UNIQUE",
+ "password": "GEN-PASSWORD",
+ "reset_ssh": false,
+ "ssh_key": "GEN-SSH-PUB-KEY",
+ "remove_user": ""
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT858 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT858
new file mode 100644
index 0000000..b360cfd
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT858
@@ -0,0 +1,310 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmaccess-on-ubuntu/azuredeploy.json",
+ "/demos/vmaccess-on-ubuntu/remove-user.parameters.json"
+ ],
+ "timestamp": 1642962902296,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmaccess-on-ubuntu/azuredeploy.json",
+ "/demos/vmaccess-on-ubuntu/remove-user.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT858",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT858",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "azureuser"
+ },
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Storage Account where the Virtual Machine's disks will be placed."
+ },
+ "value": "storagevmaccess"
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the vm, will be used as DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "binxi-vmaccess"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "VM size"
+ },
+ "value": "Standard_D2_v3"
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "16.04-LTS",
+ "metadata": {
+ "description": "The Ubuntu version"
+ },
+ "value": "14.04.2-LTS"
+ },
+ "userName": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name whose password you want to change"
+ },
+ "value": ""
+ },
+ "password": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The new password"
+ },
+ "value": ""
+ },
+ "sshKey": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The new public key"
+ },
+ "value": ""
+ },
+ "resetSSH": {
+ "type": "bool",
+ "defaultValue": false,
+ "allowedValues": [
+ true,
+ false
+ ],
+ "metadata": {
+ "description": "Whether to reset ssh"
+ },
+ "value": false
+ },
+ "userNameToRemove": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The user name you want to remove"
+ },
+ "value": "azureuser123"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPassword": {
+ "value": "User@123"
+ }
+ },
+ "variables": {
+ "virtualNetworkName": "vnet-vmaccess",
+ "nicName": "binxi-vmaccess",
+ "publicIPAddressName": "binxi-vmaccess",
+ "vnetAddressPrefix": "10.0.0.0/16",
+ "subnetName": "VMAccess",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressType": "Dynamic",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/vnet-vmaccess/VMAccess",
+ "storageAccountType": "Standard_LRS",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/azureuser/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "storagevmaccess",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "binxi-vmaccess",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "binxi-vmaccess"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "vnet-vmaccess",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "VMAccess",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "binxi-vmaccess",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//binxi-vmaccess",
+ "Microsoft.Network/virtualNetworks//vnet-vmaccess"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/binxi-vmaccess"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vnet-vmaccess/VMAccess"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "binxi-vmaccess",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//storagevmaccess",
+ "Microsoft.Network/networkInterfaces//binxi-vmaccess"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "binxi-vmaccess",
+ "adminUsername": "azureuser",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.2-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/binxi-vmaccess"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(parameters('newStorageAccountName'),'2015-06-15').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "binxi-vmaccess/enablevmaccess",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//binxi-vmaccess"
+ ],
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "VMAccessForLinux",
+ "typeHandlerVersion": "1.4",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "username": "",
+ "password": "",
+ "reset_ssh": false,
+ "ssh_key": "",
+ "remove_user": "azureuser123"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT859 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT859
new file mode 100644
index 0000000..cc2fa7a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT859
@@ -0,0 +1,310 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmaccess-on-ubuntu/azuredeploy.json",
+ "/demos/vmaccess-on-ubuntu/single-user.parameters.json"
+ ],
+ "timestamp": 1642962902304,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmaccess-on-ubuntu/azuredeploy.json",
+ "/demos/vmaccess-on-ubuntu/single-user.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT859",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT859",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Username for the Virtual Machine."
+ },
+ "value": "azureuser"
+ },
+ "newStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique DNS Name for the Storage Account where the Virtual Machine's disks will be placed."
+ },
+ "value": "storagevmaccess"
+ },
+ "vmName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the vm, will be used as DNS Name for the Public IP used to access the Virtual Machine."
+ },
+ "value": "binxi-vmaccess"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "VM size"
+ },
+ "value": "Standard_D2_v3"
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "defaultValue": "16.04-LTS",
+ "metadata": {
+ "description": "The Ubuntu version"
+ },
+ "value": "14.04.2-LTS"
+ },
+ "userName": {
+ "type": "string",
+ "metadata": {
+ "description": "The user name whose password you want to change"
+ },
+ "value": "azureuser123"
+ },
+ "password": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The new password"
+ },
+ "value": "User@123"
+ },
+ "sshKey": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The new public key"
+ },
+ "value": ""
+ },
+ "resetSSH": {
+ "type": "bool",
+ "defaultValue": false,
+ "allowedValues": [
+ true,
+ false
+ ],
+ "metadata": {
+ "description": "Whether to reset ssh"
+ },
+ "value": false
+ },
+ "userNameToRemove": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The user name you want to remove"
+ },
+ "value": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPassword": {
+ "value": "User@123"
+ }
+ },
+ "variables": {
+ "virtualNetworkName": "vnet-vmaccess",
+ "nicName": "binxi-vmaccess",
+ "publicIPAddressName": "binxi-vmaccess",
+ "vnetAddressPrefix": "10.0.0.0/16",
+ "subnetName": "VMAccess",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressType": "Dynamic",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/vnet-vmaccess/VMAccess",
+ "storageAccountType": "Standard_LRS",
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/azureuser/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2021-01-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "storagevmaccess",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "binxi-vmaccess",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "binxi-vmaccess"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "vnet-vmaccess",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "VMAccess",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "binxi-vmaccess",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//binxi-vmaccess",
+ "Microsoft.Network/virtualNetworks//vnet-vmaccess"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/binxi-vmaccess"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vnet-vmaccess/VMAccess"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "binxi-vmaccess",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//storagevmaccess",
+ "Microsoft.Network/networkInterfaces//binxi-vmaccess"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "binxi-vmaccess",
+ "adminUsername": "azureuser",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "14.04.2-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/binxi-vmaccess"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(parameters('newStorageAccountName'),'2015-06-15').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "binxi-vmaccess/enablevmaccess",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//binxi-vmaccess"
+ ],
+ "properties": {
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "VMAccessForLinux",
+ "typeHandlerVersion": "1.4",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "username": "azureuser123",
+ "password": "User@123",
+ "reset_ssh": false,
+ "ssh_key": "",
+ "remove_user": ""
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT86 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT86
new file mode 100644
index 0000000..a75e5a6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT86
@@ -0,0 +1,191 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/shared-resources-new-vnet.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885811,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/shared-resources-new-vnet.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT86",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.compute/availabilitysets",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT86",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "masterNodeASName": {
+ "type": "string"
+ },
+ "dataNodeASName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2017-12-01",
+ "name": "masterNodeASName",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2017-12-01",
+ "name": "dataNodeASName",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "networkSpec-sg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "networkSpec",
+ "apiVersion": "2018-08-01",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/networkSpec-sg"
+ ],
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "networkSpec"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "networkSpec",
+ "properties": {
+ "addressPrefix": "networkSpec",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/networkSpec-sg"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT860 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT860
new file mode 100644
index 0000000..8c6a0eb
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT860
@@ -0,0 +1,296 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmss-datascience/azuredeploy.json",
+ "/demos/vmss-datascience/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902312,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmss-datascience/azuredeploy.json",
+ "/demos/vmss-datascience/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT860",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.compute/virtualmachinescalesets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT860",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSku": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of VMs in the VM Scale Set."
+ },
+ "value": "Standard_D2_v3"
+ },
+ "vmssName": {
+ "type": "string",
+ "metadata": {
+ "description": "String used as a base for naming resources (9 characters or less). A hash is prepended to this string for some resources, and resource-specific information is appended."
+ },
+ "maxLength": 9,
+ "value": "GEN-UNIQUE-8"
+ },
+ "instanceCount": {
+ "type": "int",
+ "metadata": {
+ "description": "Number of VM instances (100 or less)."
+ },
+ "minValue": 1,
+ "maxValue": 100,
+ "value": 3
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username on all VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password on all VMs."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "osType": {
+ "type": "string",
+ "allowedValues": [
+ "windows",
+ "linux"
+ ],
+ "defaultValue": "windows",
+ "metadata": {
+ "description": "OS Type for the VMSS."
+ }
+ },
+ "licenseType": {
+ "type": "string",
+ "defaultValue": "BYOL",
+ "allowedValues": [
+ "BYOL",
+ "PAYG"
+ ],
+ "metadata": {
+ "description": "License type, only BYOL is supported in Azure US Government."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for the resources."
+ }
+ }
+ },
+ "variables": {
+ "vmSkuName": "[if(and(equals(environment().name, 'AzureCloud'), equals(parameters('licenseType'), 'PAYG')), '', 'byol')]",
+ "osType": {
+ "windows": {
+ "marketplacePlan": {
+ "name": "windows2016[if(and(equals(environment().name, 'AzureCloud'), equals(parameters('licenseType'), 'PAYG')), '', 'byol')]",
+ "publisher": "microsoft-ads",
+ "product": "windows-data-science-vm"
+ },
+ "imageReference": {
+ "publisher": "microsoft-ads",
+ "offer": "windows-data-science-vm",
+ "sku": "windows2016[if(and(equals(environment().name, 'AzureCloud'), equals(parameters('licenseType'), 'PAYG')), '', 'byol')]",
+ "version": "latest"
+ },
+ "natBackendPort": 3389
+ },
+ "linux": {
+ "marketplacePlan": {
+ "name": "linuxdsvmubuntu[if(and(equals(environment().name, 'AzureCloud'), equals(parameters('licenseType'), 'PAYG')), '', 'byol')]",
+ "publisher": "microsoft-ads",
+ "product": "linux-data-science-vm-ubuntu"
+ },
+ "imageReference": {
+ "publisher": "microsoft-ads",
+ "offer": "linux-data-science-vm-ubuntu",
+ "sku": "linuxdsvmubuntu[if(and(equals(environment().name, 'AzureCloud'), equals(parameters('licenseType'), 'PAYG')), '', 'byol')]",
+ "version": "latest"
+ },
+ "natBackendPort": 3389
+ }
+ },
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/24",
+ "virtualNetworkName": "GEN-UNIQUE-8vnet",
+ "publicIPAddressName": "GEN-UNIQUE-8pip",
+ "subnetName": "GEN-UNIQUE-8subnet",
+ "loadBalancerName": "GEN-UNIQUE-8lb",
+ "publicIPAddressID": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-8pip",
+ "natPoolName": "GEN-UNIQUE-8natpool",
+ "bePoolName": "GEN-UNIQUE-8bepool",
+ "natStartPort": 50000,
+ "natEndPort": 50120,
+ "nicName": "GEN-UNIQUE-8nic",
+ "ipConfigName": "GEN-UNIQUE-8ipconfig",
+ "frontEndIPConfigID": "[resourceID('Microsoft.Network/loadBalancers/frontendIPConfigurations', variables('loadBalancerName'), 'loadBalancerFrontEnd')]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-UNIQUE-8vnet",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-08-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE-8subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-8pip",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2019-04-01",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-8"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/loadBalancers",
+ "name": "GEN-UNIQUE-8lb",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2019-04-01",
+ "dependsOn": [
+ "[resourceID('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-8pip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "GEN-UNIQUE-8bepool"
+ }
+ ],
+ "inboundNatPools": [
+ {
+ "name": "GEN-UNIQUE-8natpool",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "[resourceID('Microsoft.Network/loadBalancers/frontendIPConfigurations', variables('loadBalancerName'), 'loadBalancerFrontEnd')]"
+ },
+ "protocol": "Tcp",
+ "frontendPortRangeStart": 50000,
+ "frontendPortRangeEnd": 50120,
+ "backendPort": "(osType)[parameters(osType)].natBackendPort"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "name": "GEN-UNIQUE-8",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2019-07-01",
+ "dependsOn": [
+ "[resourceID('Microsoft.Network/loadBalancers', variables('loadBalancerName'))]",
+ "[resourceID('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
+ ],
+ "sku": {
+ "name": "Standard_D2_v3",
+ "tier": "Standard",
+ "capacity": 3
+ },
+ "plan": "(osType)[parameters(osType)].marketplacePlan",
+ "properties": {
+ "overprovision": false,
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "caching": "ReadWrite"
+ },
+ "imageReference": "(osType)[parameters(osType)].imageReference"
+ },
+ "osProfile": {
+ "computerNamePrefix": "GEN-UNIQUE-8",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "GEN-UNIQUE-8nic",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "GEN-UNIQUE-8ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "[resourceID('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "[resourceID('Microsoft.Network/loadBalancers/backendAddressPools', variables('loadBalancerName'), variables('bePoolName'))]"
+ }
+ ],
+ "loadBalancerInboundNatPools": [
+ {
+ "id": "[resourceID('Microsoft.Network/loadBalancers/inboundNatPools', variables('loadBalancerName'), variables('natPoolName'))]"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT861 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT861
new file mode 100644
index 0000000..59b07d0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT861
@@ -0,0 +1,377 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmss-linux-jumpbox/azuredeploy.json",
+ "/demos/vmss-linux-jumpbox/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902320,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmss-linux-jumpbox/azuredeploy.json",
+ "/demos/vmss-linux-jumpbox/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT861",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachinescalesets",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT861",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSku": {
+ "type": "string",
+ "defaultValue": "Standard_A1_V2",
+ "metadata": {
+ "description": "Size of VMs in the VM Scale Set."
+ },
+ "value": "Standard_A1_V2"
+ },
+ "ubuntuOSVersion": {
+ "type": "string",
+ "allowedValues": [
+ "18.04-LTS",
+ "16.04-LTS",
+ "14.04.4-LTS"
+ ],
+ "metadata": {
+ "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values are: 16.04-LTS, 14.04.4-LTS."
+ },
+ "value": "18.04-LTS"
+ },
+ "vmssName": {
+ "type": "string",
+ "metadata": {
+ "description": "String used as a base for naming resources. Must be 3-61 characters in length and globally unique across Azure. A hash is prepended to this string for some resources, and resource-specific information is appended."
+ },
+ "maxLength": 61,
+ "value": "GEN-UNIQUE-32"
+ },
+ "instanceCount": {
+ "type": "int",
+ "metadata": {
+ "description": "Number of VM instances (100 or less)."
+ },
+ "minValue": 1,
+ "maxValue": 100,
+ "value": 5
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username on all VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "storageAccountKind": {
+ "type": "string",
+ "defaultValue": "StorageV2"
+ },
+ "storageAccountSkuName": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Premium_LRS",
+ "Standard_ZRS",
+ "Standard_GRS"
+ ],
+ "metadata": {
+ "description": "Storage Account SKU"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of the resources."
+ }
+ }
+ },
+ "variables": {
+ "namingInfix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "longNamingInfix": "[toLower(parameters('vmssName'))]",
+ "jumpBoxName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox",
+ "jumpBoxSAName": "[concat(uniqueString(concat(resourceGroup().id, variables('newStorageAccountSuffix'), 'jumpboxsa')), 'jb')]",
+ "jumpBoxOSDiskName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxosdisk",
+ "jumpBoxIPConfigName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxipconfig",
+ "jumpBoxNicName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxnic",
+ "newStorageAccountSuffix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]sa",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/24",
+ "virtualNetworkName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "subnetName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "publicIPAddressName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "nicName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "ipConfigName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "osType": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-11-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-22",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('jumpBoxSAName')]",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-02-01",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(parameters('vmssName'))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxnic",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "Microsoft.Network/virtualNetworks//[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('jumpBoxSAName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('jumpBoxNicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1_V2"
+ },
+ "osProfile": {
+ "computerName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxosdisk_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxnic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('jumpBoxSAName')), '2021-02-01').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet"
+ ],
+ "sku": {
+ "name": "Standard_A1_V2",
+ "tier": "Standard",
+ "capacity": 5
+ },
+ "properties": {
+ "overprovision": true,
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT862 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT862
new file mode 100644
index 0000000..94c5ebf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT862
@@ -0,0 +1,981 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmss-win-iis-app-ssl/azuredeploy.json",
+ "/demos/vmss-win-iis-app-ssl/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902326,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmss-win-iis-app-ssl/azuredeploy.json",
+ "/demos/vmss-win-iis-app-ssl/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT862",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.compute/virtualmachinescalesets",
+ "microsoft.insights/autoscalesettings",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT862",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appStorageType": {
+ "type": "string",
+ "defaultValue": "StandardSSD_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "StandardSSD_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "Set this value for the storage account type"
+ }
+ },
+ "frontEndVMSSName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the frontend vmss name"
+ },
+ "value": " e.g. appfevmss"
+ },
+ "serviceVMSSName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the backend or service vmss name"
+ },
+ "value": " e.g. appwcfvmss"
+ },
+ "appVMAdminUserName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the admin user name to the vmss"
+ },
+ "value": " e.g adminuser"
+ },
+ "appVMAdminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Set this value for the password for the admin user to the vmss"
+ }
+ },
+ "appVMWindowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "Windows-Server-Technical-Preview"
+ ],
+ "metadata": {
+ "description": "Set this value for the windows os version"
+ }
+ },
+ "frontEndVMSize": {
+ "type": "string",
+ "defaultValue": "Standard_D8s_v3",
+ "allowedValues": [
+ "Standard_D2_v3",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D4_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D16_v3",
+ "Standard_D2s_v3",
+ "Standard_D2s_v3",
+ "Standard_D4s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D4s_v3",
+ "Standard_D4s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D32s_v3"
+ ],
+ "metadata": {
+ "description": "Set this value for the frontend vmss size"
+ }
+ },
+ "serviceVMSize": {
+ "type": "string",
+ "defaultValue": "Standard_D8s_v3",
+ "allowedValues": [
+ "Standard_D2_v3",
+ "Standard_D2_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D4_v3",
+ "Standard_D4_v3",
+ "Standard_D8_v3",
+ "Standard_D16_v3",
+ "Standard_D2s_v3",
+ "Standard_D2s_v3",
+ "Standard_D4s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D4s_v3",
+ "Standard_D4s_v3",
+ "Standard_D8s_v3",
+ "Standard_D16s_v3",
+ "Standard_D32s_v3"
+ ],
+ "metadata": {
+ "description": "Set this value for the service or backend vmss size"
+ }
+ },
+ "appPublicIPDnsName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the dns name of the frontend public ip"
+ },
+ "value": " e.g. mytestvmdns"
+ },
+ "servicePublicIPDnsName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "Set this value for the dns name of the backend public ip"
+ },
+ "value": " e.g. appwcfdns"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "Auto-generated container in staging storage account to receive post-build staging folder upload"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ }
+ },
+ "appDSCUpdateTagVersion": {
+ "type": "string",
+ "defaultValue": "1.0",
+ "metadata": {
+ "description": "This value must be changed from a previous deployment to ensure the extension will run"
+ }
+ },
+ "appWebPackage": {
+ "type": "string",
+ "defaultValue": "https://computeteststore.blob.core.windows.net/deploypackage/deployPackage.zip?sv=2015-04-05&ss=bfqt&srt=sco&sp=r&se=2099-10-16T02:03:39Z&st=2016-10-15T18:03:39Z&spr=https&sig=aSH6yNPEGPWXk6PxTPzS6fyEXMD1ZYIkI0j5E9Hu5%2Fk%3D",
+ "metadata": {
+ "description": "Set this value for the signed uri to download the frontend deployment package"
+ }
+ },
+ "appServicePackage": {
+ "type": "string",
+ "defaultValue": "https://computeteststore.blob.core.windows.net/deploypackage/SampleWcfServices.zip?sv=2015-04-05&ss=bfqt&srt=sco&sp=r&se=2099-10-16T02:03:39Z&st=2016-10-15T18:03:39Z&spr=https&sig=aSH6yNPEGPWXk6PxTPzS6fyEXMD1ZYIkI0j5E9Hu5%2Fk%3D",
+ "metadata": {
+ "description": "Set this value for the signed uri to download the service deployment package"
+ }
+ },
+ "instanceCount": {
+ "type": "string",
+ "metadata": {
+ "description": "Number of VM instances in the vmss"
+ },
+ "value": "2"
+ },
+ "frontEndDSCVMSSUpdateTagVersion": {
+ "type": "string",
+ "defaultValue": "1.0",
+ "metadata": {
+ "description": "This value must be changed from a previous deployment to ensure the extension will run"
+ }
+ },
+ "serviceDSCVMSSUpdateTagVersion": {
+ "type": "string",
+ "defaultValue": "1.0",
+ "metadata": {
+ "description": "This value must be changed from a previous deployment to ensure the extension will run"
+ }
+ },
+ "vaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "The Azure Key vault where SSL certificates are stored"
+ },
+ "value": " e.g. myKeyVault"
+ },
+ "vaultResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resource Group of the key vault"
+ },
+ "value": " e.g. myKeyVault-rg"
+ },
+ "httpssecretUrlWithVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "full Key Vault Id to the secret that stores the SSL cert"
+ },
+ "value": " e.g https://mykeyvault.vault.azure.net/secrets/myPfxCert2/11f95456772549a2b6b0ba38bd1b319a"
+ },
+ "httpssecretCaUrlWithVersion": {
+ "type": "string",
+ "metadata": {
+ "description": "full Key Vault Id to the secret that stores the CA cert"
+ },
+ "value": " e.g https://mykeyvault.vault.azure.net/secrets/myPfxCert2/11f95456772549a2b6b0ba38bd1b319a"
+ },
+ "certificateStore": {
+ "type": "string",
+ "metadata": {
+ "description": "name of the certificate key secret"
+ },
+ "value": " e.g. myPfxCert2"
+ },
+ "certificateDomain": {
+ "type": "string",
+ "metadata": {
+ "description": "name of the domain the certificate is created for"
+ },
+ "value": " e.g. www.mycompany.com or *.mycompany.com for wildcard domains"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "appVnetPrefix": "10.0.0.0/16",
+ "appVnetSubnet1Name": "FrontEndSubNet",
+ "appVnetSubnet1Prefix": "10.0.0.0/24",
+ "appVnetSubnet2Name": "ServiceSubNet",
+ "appVnetSubnet2Prefix": "10.0.1.0/24",
+ "appVMImagePublisher": "MicrosoftWindowsServer",
+ "appVMImageOffer": "WindowsServer",
+ "frontEndVMSize": "Standard_D8s_v3",
+ "serviceVMSize": "Standard_D8s_v3",
+ "appVMSubnetRef": "Microsoft.Network/virtualNetworks/subnets/FrontEndSubNet",
+ "serviceVMSubnetRef": "Microsoft.Network/virtualNetworks/subnets/FrontEndSubNet",
+ "appPublicIPName": "appPublicIP",
+ "servicePublicIPName": "servicePublicIP",
+ "frontEndVMSSName": " e.g. appfevmss",
+ "serviceVMSSName": " e.g. appwcfvmss",
+ "publicIPAddressID": "Microsoft.Network/publicIPAddresses/appPublicIP",
+ "publicIPAddressID2": "Microsoft.Network/publicIPAddresses/servicePublicIP",
+ "lbName": "loadBalancer1",
+ "lbServiceName": "loadBalancer2",
+ "lbID": "Microsoft.Network/loadBalancers/loadBalancer1",
+ "lbServiceID": "Microsoft.Network/loadBalancers/loadBalancer2",
+ "lbFEName": "loadBalancerFrontEndWeb",
+ "lbFEServiceName": "loadBalancerFrontEndService",
+ "lbWebProbeName": "loadBalancerWebProbe",
+ "lbWebServiceProbeName": "loadBalancerWebServiceProbe",
+ "lbBEAddressPool": "loadBalancerBEAddressPool",
+ "lbBEServiceAddressPool": "loadBalancerBEServiceAddressPool",
+ "lbFEIPConfigID": "Microsoft.Network/loadBalancers/loadBalancer1/frontendIPConfigurations/loadBalancerFrontEndWeb",
+ "lbFEServiceIPConfigID": "Microsoft.Network/loadBalancers/loadBalancer2/frontendIPConfigurations/loadBalancerFrontEndService",
+ "lbBEAddressPoolID": "Microsoft.Network/loadBalancers/loadBalancer1/backendAddressPools/loadBalancerBEAddressPool",
+ "lbBEServiceAddressPoolID": "Microsoft.Network/loadBalancers/loadBalancer2/backendAddressPools/loadBalancerBEServiceAddressPool",
+ "lbWebServiceProbeID": "Microsoft.Network/loadBalancers/loadBalancer2/probes/loadBalancerWebServiceProbe",
+ "frontEndDSCVMSSArchiveFolder": "dsc",
+ "frontEndDSCVMSSArchiveFileName": "frontEndDSCVMSS.zip",
+ "serviceDSCVMSSArchiveFolder": "dsc",
+ "serviceDSCVMSSArchiveFileName": "serviceDSCVMSS.zip",
+ "natPoolNameFrontEnd": "natpoolfe",
+ "natStartPortFrontEnd": 50000,
+ "natEndPortFrontEnd": 50119,
+ "natBackendPortFrontEnd": 3389,
+ "natPoolNameService": "natpoolsvc",
+ "natStartPortService": 51000,
+ "natEndPortService": 51119,
+ "natBackendPortService": 3389,
+ "frontEndIPConfigIDWeb": "Microsoft.Network/loadBalancers/loadBalancer1/frontendIPConfigurations/loadBalancerFrontEndWeb",
+ "frontEndIPConfigIDService": "Microsoft.Network/loadBalancers/loadBalancer2/frontendIPConfigurations/loadBalancerFrontEndService",
+ "lbWebInboundNatPoolId": "Microsoft.Network/loadBalancers/loadBalancer1/inboundNatPools/natpoolfe",
+ "lbServiceInboundNatPoolId": "Microsoft.Network/loadBalancers/loadBalancer2/inboundNatPools/natpoolsvc",
+ "wadProcessorMetricName2": "Percentage CPU",
+ "wadProcessorMetricName3": "Percentage CPU",
+ "lbWebHttpsProbeName": "loadBalancerWebHttpsProbe",
+ "lbWebHttpsProbeID": "Microsoft.Network/loadBalancers/loadBalancer1/probes/loadBalancerWebHttpsProbe"
+ },
+ "resources": [
+ {
+ "apiVersion": "2015-06-15",
+ "name": "loadBalancer1",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/appPublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "loadBalancerFrontEndWeb",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/appPublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "loadBalancerBEAddressPool"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "weblb",
+ "properties": {
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/backendAddressPools/loadBalancerBEAddressPool"
+ },
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/frontendIPConfigurations/loadBalancerFrontEndWeb"
+ },
+ "frontendPort": 80,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/probes/loadBalancerWebHttpsProbe"
+ },
+ "protocol": "Tcp",
+ "loadDistribution": "SourceIP"
+ }
+ },
+ {
+ "name": "webhttpslb",
+ "properties": {
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/backendAddressPools/loadBalancerBEAddressPool"
+ },
+ "backendPort": 443,
+ "enableFloatingIP": false,
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/frontendIPConfigurations/loadBalancerFrontEndWeb"
+ },
+ "frontendPort": 443,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/probes/loadBalancerWebHttpsProbe"
+ },
+ "protocol": "Tcp",
+ "loadDistribution": "SourceIP"
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "loadBalancerWebProbe",
+ "properties": {
+ "protocol": "Http",
+ "port": 80,
+ "intervalInSeconds": 15,
+ "numberOfProbes": 5,
+ "requestPath": "hostingstart.html"
+ }
+ },
+ {
+ "name": "loadBalancerWebHttpsProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 443,
+ "intervalInSeconds": 15,
+ "numberOfProbes": 5
+ }
+ }
+ ],
+ "inboundNatPools": [
+ {
+ "name": "natpoolfe",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/frontendIPConfigurations/loadBalancerFrontEndWeb"
+ },
+ "protocol": "Tcp",
+ "frontendPortRangeStart": 50000,
+ "frontendPortRangeEnd": 50119,
+ "backendPort": 3389
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "name": "loadBalancer2",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/servicePublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "loadBalancerFrontEndService",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/servicePublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "loadBalancerBEServiceAddressPool"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "wcflb",
+ "properties": {
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer2/backendAddressPools/loadBalancerBEServiceAddressPool"
+ },
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer2/frontendIPConfigurations/loadBalancerFrontEndService"
+ },
+ "frontendPort": 80,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer2/probes/loadBalancerWebServiceProbe"
+ },
+ "protocol": "Tcp",
+ "loadDistribution": "Default"
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "loadBalancerWebServiceProbe",
+ "properties": {
+ "protocol": "Http",
+ "port": 80,
+ "intervalInSeconds": 15,
+ "numberOfProbes": 5,
+ "requestPath": "hostingstart.html"
+ }
+ }
+ ],
+ "inboundNatPools": [
+ {
+ "name": "natpoolsvc",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer2/frontendIPConfigurations/loadBalancerFrontEndService"
+ },
+ "protocol": "Tcp",
+ "frontendPortRangeStart": 51000,
+ "frontendPortRangeEnd": 51119,
+ "backendPort": 3389
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "apiVersion": "2016-04-30-preview",
+ "name": " e.g. appfevmss",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "vmsstag1": "Rev VMSS FE"
+ },
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers/loadBalancer1",
+ "Microsoft.Network/virtualNetworks/appVnet"
+ ],
+ "sku": {
+ "name": "Standard_D8s_v3",
+ "tier": "Standard",
+ "capacity": "2"
+ },
+ "properties": {
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": " e.g. appfevmss",
+ "adminUsername": " e.g adminuser",
+ "adminPassword": "appVMAdminPassword",
+ "secrets": [
+ {
+ "sourceVault": {
+ "id": " e.g. myKeyVault-rg/Microsoft.KeyVault/vaults/ e.g. myKeyVault"
+ },
+ "vaultCertificates": [
+ {
+ "certificateUrl": " e.g https://mykeyvault.vault.azure.net/secrets/myPfxCert2/11f95456772549a2b6b0ba38bd1b319a",
+ "certificateStore": " e.g. myPfxCert2"
+ }
+ ]
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "nic1",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "ip1",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/FrontEndSubNet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/backendAddressPools/loadBalancerBEAddressPool"
+ }
+ ],
+ "loadBalancerInboundNatPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer1/inboundNatPools/natpoolfe"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "extensionProfile": {
+ "extensions": [
+ {
+ "name": "Microsoft.Powershell.DSC",
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.9",
+ "autoUpgradeMinorVersion": true,
+ "forceUpdateTag": "1.0",
+ "settings": {
+ "configuration": {
+ "url": "[deployment().properties.templateLink.uri]/dsc/frontEndDSCVMSS.zip",
+ "script": "frontEndDSCVMSS.ps1",
+ "function": "Main"
+ },
+ "configurationArguments": {
+ "nodeName": "localhost",
+ "webDeployPackage": "https://computeteststore.blob.core.windows.net/deploypackage/deployPackage.zip?sv=2015-04-05&ss=bfqt&srt=sco&sp=r&se=2099-10-16T02:03:39Z&st=2016-10-15T18:03:39Z&spr=https&sig=aSH6yNPEGPWXk6PxTPzS6fyEXMD1ZYIkI0j5E9Hu5%2Fk%3D",
+ "certStoreName": " e.g. myPfxCert2",
+ "certDomain": " e.g. www.mycompany.com or *.mycompany.com for wildcard domains"
+ }
+ },
+ "protectedSettings": {
+ "configurationUrlSasToken": ""
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "apiVersion": "2016-04-30-preview",
+ "name": " e.g. appwcfvmss",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "vmsstag1": "rev Service"
+ },
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers/loadBalancer2",
+ "Microsoft.Network/virtualNetworks/appVnet"
+ ],
+ "sku": {
+ "name": "Standard_D8s_v3",
+ "tier": "Standard",
+ "capacity": "2"
+ },
+ "properties": {
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": " e.g. appwcfvmss",
+ "adminUsername": " e.g adminuser",
+ "adminPassword": "appVMAdminPassword"
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "nics1",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "ips1",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/FrontEndSubNet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer2/backendAddressPools/loadBalancerBEServiceAddressPool"
+ }
+ ],
+ "loadBalancerInboundNatPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/loadBalancer2/inboundNatPools/natpoolsvc"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "extensionProfile": {
+ "extensions": [
+ {
+ "name": "Microsoft.Powershell.DSC",
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.9",
+ "autoUpgradeMinorVersion": true,
+ "forceUpdateTag": "1.0",
+ "settings": {
+ "configuration": {
+ "url": "[deployment().properties.templateLink.uri]/dsc/serviceDSCVMSS.zip",
+ "script": "serviceDSCVMSS.ps1",
+ "function": "Main"
+ },
+ "configurationArguments": {
+ "nodeName": "localhost",
+ "webDeployPackage": "https://computeteststore.blob.core.windows.net/deploypackage/SampleWcfServices.zip?sv=2015-04-05&ss=bfqt&srt=sco&sp=r&se=2099-10-16T02:03:39Z&st=2016-10-15T18:03:39Z&spr=https&sig=aSH6yNPEGPWXk6PxTPzS6fyEXMD1ZYIkI0j5E9Hu5%2Fk%3D"
+ }
+ },
+ "protectedSettings": {
+ "configurationUrlSasToken": ""
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "appNetworkSecurityGroup",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "webrule",
+ "properties": {
+ "description": "This rule allows traffic in on port 80",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "INTERNET",
+ "destinationAddressPrefix": "10.0.0.0/24",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "webHttpsRule",
+ "properties": {
+ "description": "This rule allows traffic in on port 443",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "INTERNET",
+ "destinationAddressPrefix": "10.0.0.0/24",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "rdprule",
+ "properties": {
+ "description": "This rule allows traffic on port 3389 from the web",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "INTERNET",
+ "destinationAddressPrefix": "10.0.0.0/24",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "appVnet",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/appNetworkSecurityGroup"
+ ],
+ "tags": {
+ "displayName": "appVnet"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "FrontEndSubNet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/appNetworkSecurityGroup"
+ }
+ }
+ },
+ {
+ "name": "ServiceSubNet",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/appNetworkSecurityGroup"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "appPublicIP",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [],
+ "tags": {
+ "displayName": "appPublicIP"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": " e.g. mytestvmdns"
+ }
+ }
+ },
+ {
+ "name": "servicePublicIP",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-06-15",
+ "dependsOn": [],
+ "tags": {
+ "displayName": "servicePublicIP"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": " e.g. appwcfdns"
+ }
+ }
+ },
+ {
+ "apiVersion": "2015-04-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachineScaleSets/ e.g. appfevmss"
+ ],
+ "location": "[resourceGroup().location]",
+ "name": " e.g. appfevmssautoscale",
+ "properties": {
+ "name": " e.g. appfevmssautoscale",
+ "targetResourceUri": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Compute/virtualMachineScaleSets/', variables('frontEndVMSSName'))]",
+ "enabled": true,
+ "profiles": [
+ {
+ "name": "Profile1",
+ "capacity": {
+ "default": "2",
+ "maximum": "10",
+ "minimum": "2"
+ },
+ "rules": [
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricNamespace": "",
+ "metricResourceUri": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Compute/virtualMachineScaleSets/', variables('frontEndVMSSName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT5M",
+ "timeAggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 50
+ },
+ "scaleAction": {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT5M"
+ }
+ },
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricNamespace": "",
+ "metricResourceUri": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Compute/virtualMachineScaleSets/', variables('frontEndVMSSName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT5M",
+ "timeAggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 30
+ },
+ "scaleAction": {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT1M"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "tags": {
+ "displayName": " e.g. appfevmssautoscale"
+ },
+ "type": "Microsoft.Insights/autoscaleSettings"
+ },
+ {
+ "name": " e.g. appwcfvmssautoscale",
+ "type": "Microsoft.Insights/autoscaleSettings",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2015-04-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachineScaleSets/ e.g. appwcfvmss"
+ ],
+ "tags": {
+ "displayName": " e.g. appwcfvmssautoscale"
+ },
+ "properties": {
+ "name": " e.g. appwcfvmssautoscale",
+ "targetResourceUri": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Compute/virtualMachineScaleSets/', variables('serviceVMSSName'))]",
+ "enabled": true,
+ "profiles": [
+ {
+ "name": "Profile1",
+ "capacity": {
+ "minimum": "2",
+ "maximum": "10",
+ "default": "2"
+ },
+ "rules": [
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricNamespace": "",
+ "metricResourceUri": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Compute/virtualMachineScaleSets/', variables('serviceVMSSName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT5M",
+ "timeAggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 50
+ },
+ "scaleAction": {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT5M"
+ }
+ },
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricNamespace": "",
+ "metricResourceUri": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Compute/virtualMachineScaleSets/', variables('serviceVMSSName'))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT5M",
+ "timeAggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 30
+ },
+ "scaleAction": {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT1M"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT863 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT863
new file mode 100644
index 0000000..4b26e92
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT863
@@ -0,0 +1,339 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmss-windows-jumpbox/azuredeploy.json",
+ "/demos/vmss-windows-jumpbox/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902333,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmss-windows-jumpbox/azuredeploy.json",
+ "/demos/vmss-windows-jumpbox/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT863",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachinescalesets",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT863",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSku": {
+ "type": "string",
+ "defaultValue": "Standard_A1_V2",
+ "metadata": {
+ "description": "Size of VMs in the VM Scale Set."
+ },
+ "value": "Standard_A1_V2"
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2019-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "2016-Datacenter",
+ "2019-Datacenter"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
+ }
+ },
+ "vmssName": {
+ "type": "string",
+ "metadata": {
+ "description": "String used as a base for naming resources. Must be 3-61 characters in length and globally unique across Azure. A hash is prepended to this string for some resources, and resource-specific information is appended."
+ },
+ "maxLength": 61,
+ "value": "GEN-UNIQUE-32"
+ },
+ "instanceCount": {
+ "type": "int",
+ "metadata": {
+ "description": "Number of VM instances (100 or less)."
+ },
+ "minValue": 2,
+ "maxValue": 100,
+ "value": 5
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username on all VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password on all VMs."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Default location"
+ }
+ }
+ },
+ "variables": {
+ "namingInfix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "longNamingInfix": "[toLower(parameters('vmssName'))]",
+ "jumpBoxName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox",
+ "jumpBoxSAName": "[concat(uniqueString(concat(resourceGroup().id, variables('newStorageAccountSuffix'), 'jumpboxsa')), 'jb')]",
+ "jumpBoxOSDiskName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox_OSDisk",
+ "jumpBoxIPConfigName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxipconfig",
+ "jumpBoxNicName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxnic",
+ "newStorageAccountSuffix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]sa",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/24",
+ "virtualNetworkName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "subnetName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "publicIPAddressName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "nicName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "ipConfigName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "osType": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-07-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-3389",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "3389",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('jumpBoxSAName')]",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-02-01",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(parameters('vmssName'))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxnic",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-07-01",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "Microsoft.Network/virtualNetworks/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('jumpBoxSAName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces', variables('jumpBoxNicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1_V2"
+ },
+ "osProfile": {
+ "computerName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jbox_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]jboxnic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('jumpBoxSAName')), '2019-06-01').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet"
+ ],
+ "sku": {
+ "name": "Standard_A1_V2",
+ "tier": "Standard",
+ "capacity": 5
+ },
+ "properties": {
+ "overprovision": "true",
+ "upgradePolicy": {
+ "mode": "Manual"
+ },
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "createOption": "FromImage",
+ "caching": "ReadWrite"
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT864 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT864
new file mode 100644
index 0000000..8870456
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT864
@@ -0,0 +1,458 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/vmss-windows-webapp-dsc-autoscale/azuredeploy.json",
+ "/demos/vmss-windows-webapp-dsc-autoscale/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902339,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/vmss-windows-webapp-dsc-autoscale/azuredeploy.json",
+ "/demos/vmss-windows-webapp-dsc-autoscale/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT864",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.compute/virtualmachinescalesets",
+ "microsoft.insights/autoscalesettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT864",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vmSku": {
+ "type": "string",
+ "defaultValue": "Standard_A1_v2",
+ "metadata": {
+ "description": "Size of VMs in the VM Scale Set."
+ }
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2019-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter",
+ "2016-Datacenter",
+ "2019-Datacenter"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter & 2016-Datacenter, 2019-Datacenter."
+ }
+ },
+ "vmssName": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 61,
+ "metadata": {
+ "description": "String used as a base for naming resources. Must be 3-61 characters in length and globally unique across Azure. A hash is prepended to this string for some resources, and resource-specific information is appended."
+ },
+ "value": "GEN-UNIQUE-5"
+ },
+ "instanceCount": {
+ "type": "int",
+ "defaultValue": 3,
+ "minValue": 1,
+ "maxValue": 100,
+ "metadata": {
+ "description": "Number of VM instances (100 or less)."
+ }
+ },
+ "singlePlacementGroup": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "When true this limits the scale set to a single placement group, of max size 100 virtual machines. NOTE: If singlePlacementGroup is true, it may be modified to false. However, if singlePlacementGroup is false, it may not be modified to true."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "vmssadmin",
+ "metadata": {
+ "description": "Admin username on all VMs."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password on all VMs."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templatelink.uri]",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. For example, if stored on a public GitHub repo, you'd use the following URI: https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-vmss-windows-webapp-dsc-autoscale/."
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. If your artifacts are stored on a public repo or public storage account you can leave this blank."
+ }
+ },
+ "powershelldscZip": {
+ "type": "string",
+ "defaultValue": "DSC/InstallIIS.zip",
+ "metadata": {
+ "description": "Location of the PowerShell DSC zip file relative to the URI specified in the _artifactsLocation, i.e. DSC/IISInstall.ps1.zip"
+ }
+ },
+ "webDeployPackage": {
+ "type": "string",
+ "defaultValue": "WebDeploy/DefaultASPWebApp.v1.0.zip",
+ "metadata": {
+ "description": "Location of the of the WebDeploy package zip file relative to the URI specified in _artifactsLocation, i.e. WebDeploy/DefaultASPWebApp.v1.0.zip"
+ }
+ },
+ "powershelldscUpdateTagVersion": {
+ "type": "string",
+ "defaultValue": "1.0",
+ "metadata": {
+ "description": "Version number of the DSC deployment. Changing this value on subsequent deployments will trigger the extension to run."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "platformFaultDomainCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "Fault Domain count for each placement group."
+ }
+ }
+ },
+ "variables": {
+ "namingInfix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "longNamingInfix": "[toLower(parameters('vmssName'))]",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.0.0/24",
+ "virtualNetworkName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "publicIPAddressName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "subnetName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "loadBalancerName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb",
+ "publicIPAddressID": "Microsoft.Network/publicIPAddresses/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "lbProbeID": "Microsoft.Network/loadBalancers/probes/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/tcpProbe",
+ "natPoolName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]natpool",
+ "bePoolName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool",
+ "lbPoolID": "Microsoft.Network/loadBalancers/backendAddressPools/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool",
+ "natStartPort": 50000,
+ "natEndPort": 50119,
+ "natBackendPort": 3389,
+ "nicName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "ipConfigName": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "frontEndIPConfigID": "Microsoft.Network/loadBalancers/frontendIPConfigurations/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/loadBalancerFrontEnd",
+ "osType": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "webDeployPackageFullPath": "[uri(parameters('_artifactsLocation'), concat(parameters('webDeployPackage'), parameters('_artifactsLocationSasToken')))]",
+ "powershelldscZipFullPath": "[uri(parameters('_artifactsLocation'), concat(parameters('powershelldscZip'), parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/loadBalancers",
+ "apiVersion": "2020-06-01",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool"
+ }
+ ],
+ "inboundNatPools": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]natpool",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/loadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPortRangeStart": 50000,
+ "frontendPortRangeEnd": 50119,
+ "backendPort": 3389
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "LBRule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/loadBalancerFrontEnd"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 5,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/tcpProbe"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "tcpProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachineScaleSets",
+ "apiVersion": "2020-06-01",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_A1_v2",
+ "tier": "Standard",
+ "capacity": 3
+ },
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb",
+ "Microsoft.Network/virtualNetworks/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet"
+ ],
+ "properties": {
+ "overprovision": true,
+ "upgradePolicy": {
+ "mode": "Automatic"
+ },
+ "singlePlacementGroup": true,
+ "platformFaultDomainCount": 1,
+ "virtualMachineProfile": {
+ "storageProfile": {
+ "osDisk": {
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ },
+ "osProfile": {
+ "computerNamePrefix": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "networkProfile": {
+ "networkInterfaceConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]nic",
+ "properties": {
+ "primary": true,
+ "ipConfigurations": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]ipconfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]bepool"
+ }
+ ],
+ "loadBalancerInboundNatPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatPools/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]lb/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]natpool"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "extensionProfile": {
+ "extensions": [
+ {
+ "name": "Microsoft.Powershell.DSC",
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.9",
+ "autoUpgradeMinorVersion": true,
+ "forceUpdateTag": "1.0",
+ "settings": {
+ "configuration": {
+ "url": "[uri(parameters('_artifactsLocation'), concat(parameters('powershelldscZip'), parameters('_artifactsLocationSasToken')))]",
+ "script": "InstallIIS.ps1",
+ "function": "InstallIIS"
+ },
+ "configurationArguments": {
+ "nodeName": "localhost",
+ "WebDeployPackagePath": "[uri(parameters('_artifactsLocation'), concat(parameters('webDeployPackage'), parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-06-01",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]pip",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(parameters('vmssName'))]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-06-01",
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]vnet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Insights/autoscaleSettings",
+ "apiVersion": "2015-04-01",
+ "name": "autoscalehost",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachineScaleSets//[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]"
+ ],
+ "properties": {
+ "name": "autoscalehost",
+ "targetResourceUri": "Microsoft.Compute/virtualMachineScaleSets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "enabled": true,
+ "profiles": [
+ {
+ "name": "Profile1",
+ "capacity": {
+ "minimum": "1",
+ "maximum": "10",
+ "default": "1"
+ },
+ "rules": [
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricResourceUri": "Microsoft.Compute/virtualMachineScaleSets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT5M",
+ "timeAggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 50
+ },
+ "scaleAction": {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT5M"
+ }
+ },
+ {
+ "metricTrigger": {
+ "metricName": "Percentage CPU",
+ "metricResourceUri": "Microsoft.Compute/virtualMachineScaleSets/[toLower(substring(concat(parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]",
+ "timeGrain": "PT1M",
+ "statistic": "Average",
+ "timeWindow": "PT5M",
+ "timeAggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 30
+ },
+ "scaleAction": {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": "1",
+ "cooldown": "PT5M"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "applicationUrl": {
+ "type": "string",
+ "value": "[concat('http://', reference(variables('publicIPAddressName')).dnsSettings.fqdn, '/MyApp')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT865 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT865
new file mode 100644
index 0000000..022e61d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT865
@@ -0,0 +1,131 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/app.json"
+ ],
+ "timestamp": 1642962902347,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/app.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT865",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT865",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appName": {
+ "type": "string",
+ "metadata": {
+ "description": "name of app service web app (must be globally unique)"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "location to deploy app service web app"
+ }
+ },
+ "hostingPlanName": {
+ "type": "string",
+ "metadata": {
+ "description": "name of app service hosting plan"
+ }
+ },
+ "ipAddressRestriction": {
+ "type": "array",
+ "defaultValue": [
+ {
+ "ipAddress": "0.0.0.0/32"
+ }
+ ],
+ "metadata": {
+ "description": "ip address restrictions for web app"
+ }
+ },
+ "subnet": {
+ "type": "string",
+ "metadata": {
+ "description": "resource id of subnet to use for app service reginal vnet integration"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Web/sites",
+ "name": "[tolower(parameters('appName'))]",
+ "apiVersion": "2019-08-01",
+ "location": "location",
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "type": "config",
+ "name": "web",
+ "dependsOn": [
+ "[tolower(parameters('appName'))]"
+ ],
+ "properties": {
+ "ipSecurityRestrictions": [
+ {
+ "ipAddress": "0.0.0.0/32"
+ }
+ ]
+ }
+ },
+ {
+ "name": "virtualNetwork",
+ "type": "networkConfig",
+ "apiVersion": "2019-08-01",
+ "location": "location",
+ "properties": {
+ "subnetResourceId": "subnet",
+ "swiftSupported": true
+ },
+ "dependsOn": [
+ "Microsoft.Web/sites/appName"
+ ]
+ }
+ ],
+ "properties": {
+ "name": "[tolower(parameters('appName'))]",
+ "serverFarmId": "Microsoft.Web/serverfarms/hostingPlanName",
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "WEBSITE_VNET_ROUTE_ALL",
+ "value": 1
+ },
+ {
+ "name": "WEBSITE_DNS_SERVER",
+ "value": "168.63.129.16"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "appName": {
+ "type": "string",
+ "value": "[parameters('appName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT866 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT866
new file mode 100644
index 0000000..c22589c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT866
@@ -0,0 +1,79 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/app_svc_plan.json"
+ ],
+ "timestamp": 1642962902352,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/app_svc_plan.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT866",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT866",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "suffix": {
+ "type": "string",
+ "metadata": {
+ "description": "naming suffix based on resource group name hash"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "location to deploy app service plan"
+ }
+ },
+ "serverFarmSku": {
+ "defaultValue": {
+ "Tier": "Standard",
+ "Name": "S1"
+ },
+ "type": "object",
+ "metadata": {
+ "description": "app service plan SKU"
+ }
+ }
+ },
+ "variables": {
+ "serverFarmName": "app-svc-plan-suffix"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/serverfarms",
+ "sku": {
+ "Tier": "Standard",
+ "Name": "S1"
+ },
+ "kind": "app",
+ "name": "[tolower(variables('serverFarmName'))]",
+ "apiVersion": "2019-08-01",
+ "location": "location"
+ }
+ ],
+ "outputs": {
+ "serverFarmName": {
+ "type": "string",
+ "value": "[variables('serverFarmName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT867 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT867
new file mode 100644
index 0000000..798d59b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT867
@@ -0,0 +1,269 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/dns_record.json"
+ ],
+ "timestamp": 1642962902357,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/dns_record.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT867",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/privatednszones/a"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT867",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "privateDnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "private DNS zone name"
+ }
+ },
+ "privateLinkNicIpConfig": {
+ "type": "object",
+ "metadata": {
+ "description": "private endpoint Nic ipConfiguration array resource id"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/A",
+ "name": "[concat(parameters('privateDnsZoneName'),'/', split(parameters('privateLinkNicIpConfig').properties.privateLinkConnectionProperties.fqdns[copyIndex()], '.')[0])]",
+ "location": "global",
+ "apiVersion": "2020-01-01",
+ "properties": {
+ "aRecords": "[concat(json(concat('[{\"ipv4Address\":\"', parameters('privateLinkNicIpConfig').properties.privateIPAddress,'\"}]')))]",
+ "ttl": 3600
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT868 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT868
new file mode 100644
index 0000000..5fc7046
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT868
@@ -0,0 +1,80 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_dns.json"
+ ],
+ "timestamp": 1642962902369,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_dns.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT868",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/privatednszones",
+ "microsoft.network/privatednszones/virtualnetworklinks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT868",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "privateDnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "private dns zone name"
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "virtual network name"
+ }
+ },
+ "enableVmRegistration": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "controls whether the dns zone will automatically register DNS records for resources in the virtual network"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-01-01",
+ "name": "privateDnsZoneName",
+ "location": "global"
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-01-01",
+ "name": "privateDnsZoneName/privateDnsZoneName-virtualNetworkName-link",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privateDnsZoneName"
+ ],
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/virtualNetworkName"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT869 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT869
new file mode 100644
index 0000000..da1c050
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT869
@@ -0,0 +1,110 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_link.json"
+ ],
+ "timestamp": 1642962902375,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_link.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT869",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/privateendpoints"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT869",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "suffix": {
+ "type": "string",
+ "metadata": {
+ "description": "naming suffix based on resource group name hash"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "location to deploy private link endpoint web app"
+ }
+ },
+ "resourceType": {
+ "type": "string",
+ "metadata": {
+ "description": " private link resource type"
+ }
+ },
+ "resourceName": {
+ "type": "string",
+ "metadata": {
+ "description": "private link resource name"
+ }
+ },
+ "groupType": {
+ "type": "string",
+ "metadata": {
+ "description": "private link resource group id"
+ }
+ },
+ "subnet": {
+ "type": "string",
+ "metadata": {
+ "description": "resource id of private link subnet"
+ }
+ }
+ },
+ "variables": {
+ "prefix": "[guid(parameters('resourceType'))]",
+ "privateEndpointName": "[guid(parameters('resourceType'))]-pep-suffix",
+ "privateEndpointConnectionName": "[guid(parameters('resourceType'))]-pep-cxn-suffix"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "[guid(parameters('resourceType'))]-pep-suffix",
+ "type": "Microsoft.Network/privateEndpoints",
+ "location": "location",
+ "properties": {
+ "privateLinkServiceConnections": [
+ {
+ "name": "[guid(parameters('resourceType'))]-pep-cxn-suffix",
+ "properties": {
+ "privateLinkServiceId": "resourceType/resourceName",
+ "groupIds": [
+ "groupType"
+ ]
+ }
+ }
+ ],
+ "subnet": {
+ "id": "subnet"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "privateLinkNicResource": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Network/privateEndpoints', variables('privateEndpointName')), '2019-11-01').networkInterfaces[0].id]"
+ },
+ "privateEndpointName": {
+ "type": "string",
+ "value": "[variables('privateEndpointName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT87 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT87
new file mode 100644
index 0000000..3cf0bb9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT87
@@ -0,0 +1,347 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/vm-10-datadisks.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885834,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/vm-10-datadisks.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT87",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT87",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "singleQuote": "'",
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "GEN-UNIQUE-10-dn",
+ "nicName": "GEN-UNIQUE-10-dn-nic",
+ "publicIPAddressName": "GEN-UNIQUE-10-dn-publicIP",
+ "securityGroupName": "GEN-UNIQUE-10-dn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "GEN-UNIQUE-10-dn-sg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-10-dncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE-10-dn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ ],
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2017-03-30",
+ "name": "GEN-UNIQUE-10-dncopyIndex()",
+ "plan": "vmSpec",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": false
+ }
+ },
+ "storageProfile": {
+ "imageReference": "vmSpec",
+ "osDisk": {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk1",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk2",
+ "diskSizeGB": 1023,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk3",
+ "diskSizeGB": 1023,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk4",
+ "diskSizeGB": 1023,
+ "lun": 3,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk5",
+ "diskSizeGB": 1023,
+ "lun": 4,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk6",
+ "diskSizeGB": 1023,
+ "lun": 5,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk76",
+ "diskSizeGB": 1023,
+ "lun": 6,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk8",
+ "diskSizeGB": 1023,
+ "lun": 7,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk9",
+ "diskSizeGB": 1023,
+ "lun": 8,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk10",
+ "diskSizeGB": 1023,
+ "lun": 9,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk11",
+ "diskSizeGB": 1023,
+ "lun": 10,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-10-dncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE-10-dncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-datanode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh ', variables('singleQuote'), variables('masterIP'), variables('singleQuote'), ' ', variables('singleQuote'), variables('workerIP'), variables('singleQuote'), ' ', variables('singleQuote'), parameters('dnsNamePrefix'), variables('singleQuote'), ' ', variables('singleQuote'), reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').masterNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').dataNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('vmSpec').adminUsername, variables('singleQuote'), ' ', 'datanode', ' >> /var/log/cloudera-azure-initialize.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT870 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT870
new file mode 100644
index 0000000..1a47ca0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT870
@@ -0,0 +1,86 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_link_ipconfigs.json"
+ ],
+ "timestamp": 1642962902382,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_link_ipconfigs.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT870",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT870",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "privateDnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "private dns zone name"
+ }
+ },
+ "privateLinkNicResource": {
+ "type": "string",
+ "metadata": {
+ "description": "private endpoint Nic ipConfigurations array resource id"
+ }
+ },
+ "privateLinkNicIpConfigTemplateUri": {
+ "type": "string",
+ "metadata": {
+ "description": "ip configurations template resource URI"
+ }
+ },
+ "privateDnsRecordTemplateUri": {
+ "type": "string",
+ "metadata": {
+ "description": "private dns record template resource URI"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "private-link-ipconfigs",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfigs": {
+ "value": "[reference(parameters('privateLinkNicResource'), '2019-11-01').ipConfigurations]"
+ },
+ "privateDnsRecordTemplateUri": {
+ "value": "privateDnsRecordTemplateUri"
+ }
+ },
+ "templateLink": {
+ "uri": "privateLinkNicIpConfigTemplateUri"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "functions": [],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT871 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT871
new file mode 100644
index 0000000..e461963
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT871
@@ -0,0 +1,495 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_link_ipconfigs_helper.json"
+ ],
+ "timestamp": 1642962902389,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/private_link_ipconfigs_helper.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT871",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT871",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "privateDnsZoneName": {
+ "type": "string",
+ "metadata": {
+ "description": "private DNS zone name"
+ }
+ },
+ "privateLinkNicIpConfigs": {
+ "type": "array",
+ "metadata": {
+ "description": "private endpoint nic ip configuration array"
+ }
+ },
+ "privateDnsRecordTemplateUri": {
+ "type": "string",
+ "metadata": {
+ "description": "private dns zone record template resource URI"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-10-01",
+ "name": "nestedTemplate-private-link-ipconfigs-helpercopyIndex()",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "privateDnsZoneName"
+ },
+ "privateLinkNicIpConfig": {
+ "value": "privateLinkNicIpConfigs)[copyIndex("
+ }
+ },
+ "templateLink": {
+ "uri": "privateDnsRecordTemplateUri"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "functions": [],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT872 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT872
new file mode 100644
index 0000000..e53509e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT872
@@ -0,0 +1,133 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/sqldb.json"
+ ],
+ "timestamp": 1642962902400,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/sqldb.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT872",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT872",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "suffix": {
+ "type": "string",
+ "metadata": {
+ "description": "naming suffix based on resource group name hash"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "location to deploy the Azure SQL Db server"
+ }
+ },
+ "sqlAdministratorLogin": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure SQL Db server administrator login name"
+ }
+ },
+ "sqlAdministratorLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Azure SQL Db server administrator login password"
+ }
+ },
+ "databaseName": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure SQL database name"
+ }
+ },
+ "databaseEdition": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "metadata": {
+ "description": "Azure SQL database edition"
+ }
+ },
+ "databaseCollation": {
+ "type": "string",
+ "defaultValue": "SQL_Latin1_General_CP1_CI_AS",
+ "metadata": {
+ "description": "Azure SQL database collation type"
+ }
+ },
+ "databaseServiceObjectiveName": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "metadata": {
+ "description": "Azure SQL database service objective type name"
+ }
+ }
+ },
+ "variables": {
+ "sqlServerName": "sql-server-suffix"
+ },
+ "resources": [
+ {
+ "name": "sql-server-suffix",
+ "type": "Microsoft.Sql/servers",
+ "apiVersion": "2020-02-02-preview",
+ "location": "location",
+ "properties": {
+ "administratorLogin": "sqlAdministratorLogin",
+ "administratorLoginPassword": "sqlAdministratorLoginPassword",
+ "version": "12.0",
+ "publicNetworkAccess": "Disabled"
+ },
+ "resources": [
+ {
+ "name": "databaseName",
+ "type": "databases",
+ "apiVersion": "2020-02-02-preview",
+ "location": "location",
+ "dependsOn": [
+ "sql-server-suffix"
+ ],
+ "properties": {
+ "edition": "Basic",
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "requestedServiceObjectiveName": "Basic"
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "sqlServerFqdn": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Sql/servers', variables('sqlServerName'))).fullyQualifiedDomainName]"
+ },
+ "sqlServerName": {
+ "type": "string",
+ "value": "[variables('sqlServerName')]"
+ },
+ "databaseName": {
+ "type": "string",
+ "value": "[parameters('databaseName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT873 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT873
new file mode 100644
index 0000000..badc9af
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT873
@@ -0,0 +1,136 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/storage.json"
+ ],
+ "timestamp": 1642962902407,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/storage.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT873",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT873",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "suffix": {
+ "type": "string",
+ "metadata": {
+ "description": "naming suffix based on resource group name hash"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "location to deploy the storage account"
+ }
+ },
+ "storageSku": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "storage account SKU"
+ }
+ },
+ "storageKind": {
+ "type": "string",
+ "defaultValue": "StorageV2",
+ "metadata": {
+ "description": "storage account kind"
+ }
+ },
+ "containerName": {
+ "type": "string",
+ "metadata": {
+ "description": "storage account container name"
+ }
+ },
+ "defaultNetworkAccessAction": {
+ "type": "string",
+ "defaultValue": "Allow",
+ "allowedValues": [
+ "Allow",
+ "Deny"
+ ],
+ "metadata": {
+ "description": "allor or deny internet access to storage account"
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "storsuffix"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "storsuffix",
+ "apiVersion": "2021-02-01",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "location": "location",
+ "properties": {
+ "networkAcls": {
+ "bypass": "AzureServices",
+ "defaultAction": "Allow"
+ },
+ "supportsHttpsTrafficOnly": true,
+ "encryption": {
+ "services": {
+ "file": {
+ "enabled": true
+ },
+ "blob": {
+ "enabled": true
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ },
+ "accessTier": "Hot"
+ },
+ "resources": [
+ {
+ "name": "default/containerName",
+ "type": "blobServices/containers",
+ "apiVersion": "2019-06-01",
+ "dependsOn": [
+ "storsuffix"
+ ]
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "storageAccountName": {
+ "type": "string",
+ "value": "[variables('storageAccountName')]"
+ },
+ "storageContainerUri": {
+ "type": "string",
+ "value": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob, parameters('containerName'))]"
+ },
+ "containerName": {
+ "type": "string",
+ "value": "[parameters('containerName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT874 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT874
new file mode 100644
index 0000000..1bd3335
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT874
@@ -0,0 +1,101 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/vnets.json"
+ ],
+ "timestamp": 1642962902414,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/vnets.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT874",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT874",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "suffix": {
+ "type": "string",
+ "metadata": {
+ "description": "virtual network name sufix based on resource group hash"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "location to dpeloy the vnet"
+ }
+ },
+ "vNets": {
+ "type": "object",
+ "metadata": {
+ "description": "JSON input object defining Vnets and subnets. The first network in the array is assumed to be the hub netwkr and will be peered to all subsequent networks"
+ }
+ }
+ },
+ "variables": {
+ "copy": [
+ {
+ "name": "subnets",
+ "count": 27,
+ "input": {
+ "name": "vNets).subnets[copyIndex(subnets",
+ "properties": {
+ "addressPrefix": "vNets).subnets[copyIndex(subnets",
+ "delegations": "[if(equals(parameters('vNets').subnets[copyIndex('subnets')].delegations, json('null')), json('null'), parameters('vNets').subnets[copyIndex('subnets')].delegations)]",
+ "privateEndpointNetworkPolicies": "[if(equals(parameters('vNets').subnets[copyIndex('subnets')].privateEndpointNetworkPolicies, json('null')), json('null'), parameters('vNets').subnets[copyIndex('subnets')].privateEndpointNetworkPolicies)]",
+ "privateLinkServiceNetworkPolicies": "[if(equals(parameters('vNets').subnets[copyIndex('subnets')].privateLinkServiceNetworkPolicies, json('null')), json('null'), parameters('vNets').subnets[copyIndex('subnets')].privateLinkServiceNetworkPolicies)]",
+ "routeTable": "[if(equals(parameters('vNets').subnets[copyIndex('subnets')].udrName, json('null')), json('null'), json(concat('{\"id\": \"', resourceId('Microsoft.Network/routeTables', concat(parameters('vNets').subnets[copyIndex('subnets')].udrName, '-rt-', parameters('suffix'))), '\"}', '\"}')))]",
+ "networkSecurityGroup": "[if(equals(parameters('vNets').subnets[copyIndex('subnets')].nsgName, json('null')), json('null'), json(concat('{\"id\": \"', resourceId('Microsoft.Network/networkSecurityGroups', concat(parameters('vNets').subnets[copyIndex('subnets')].nsgName, '-nsg-', parameters('suffix'))), '\"}', '\"}')))]"
+ },
+ "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets/', concat(parameters('vNets').name, '-', parameters('suffix')), parameters('vNets').subnets[copyIndex('subnets')].name)]"
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "name": "vNets-suffix",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "apiVersion": "2020-08-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": "vNets"
+ },
+ "subnets": "subnets"
+ }
+ }
+ ],
+ "outputs": {
+ "subnetResourceIds": {
+ "type": "array",
+ "value": "[variables('subnets')]"
+ },
+ "vnetRef": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/virtualNetworks/', concat(parameters('vNets').name, '-', parameters('suffix')))]"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "value": "[concat(parameters('vNets').name, '-', parameters('suffix'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT875 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT875
new file mode 100644
index 0000000..56cb193
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT875
@@ -0,0 +1,95 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/vnet_peering.json"
+ ],
+ "timestamp": 1642962902421,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/nestedtemplates/vnet_peering.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT875",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks/virtualnetworkpeerings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT875",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "suffix": {
+ "type": "string",
+ "metadata": {
+ "description": "naming suffix based on resource group name hash"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "location to deploy the storage account"
+ }
+ },
+ "vNets": {
+ "type": "array",
+ "metadata": {
+ "description": "array of JSON virtual network objects"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "apiVersion": "2018-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "[concat(parameters('vNets')[0].name, '-', parameters('suffix'), '/peering-to-', parameters('vnets')[copyIndex(1)].name, '-', parameters('suffix'))]",
+ "location": "location",
+ "copy": {
+ "name": "hubPeeringCopy",
+ "count": "[sub(length(parameters('vNets')), 1)]"
+ },
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "[resourceId('Microsoft.Network/virtualNetworks', concat(parameters('vNets')[copyIndex(1)].name, '-', parameters('suffix')))]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2018-11-01",
+ "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
+ "name": "[concat(parameters('vNets')[copyIndex(1)].name, '-', parameters('suffix'), '/peering-to-', parameters('vNets')[0].name, '-', parameters('suffix'))]",
+ "location": "location",
+ "copy": {
+ "name": "spokePeeringCopy",
+ "count": "[sub(length(parameters('vNets')), 1)]"
+ },
+ "properties": {
+ "allowVirtualNetworkAccess": true,
+ "allowForwardedTraffic": true,
+ "allowGatewayTransit": false,
+ "useRemoteGateways": false,
+ "remoteVirtualNetwork": {
+ "id": "[resourceId('Microsoft.Network/virtualNetworks', concat(parameters('vNets')[0].name, '-', parameters('suffix')))]"
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT876 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT876
new file mode 100644
index 0000000..93b4939
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT876
@@ -0,0 +1,625 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/azuredeploy.json",
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902428,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/azuredeploy.json",
+ "/demos/web-app-regional-vnet-private-endpoint-sql-storage/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT876",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT876",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "secureString",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "deployment location"
+ }
+ },
+ "webAppName": {
+ "type": "string",
+ "defaultValue": "[concat('web-app-', uniqueString(subscription().id, resourceGroup().id))]",
+ "metadata": {
+ "description": "unique web app name"
+ }
+ },
+ "sqlAdministratorLoginName": {
+ "type": "string",
+ "metadata": {
+ "description": "Azure SQL DB administrator login name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sqlAdministratorLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Azure SQL DB administrator password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vNets": {
+ "type": "array",
+ "metadata": {
+ "description": "JSON object describing virtual networks & subnets"
+ },
+ "value": [
+ {
+ "name": "hub-vnet",
+ "addressPrefixes": [
+ "10.1.0.0/16"
+ ],
+ "subnets": [
+ {
+ "name": "PrivateLinkSubnet",
+ "addressPrefix": "10.1.1.0/24",
+ "udrName": null,
+ "nsgName": null,
+ "delegations": null,
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ ]
+ },
+ {
+ "name": "spoke-vnet",
+ "addressPrefixes": [
+ "10.2.0.0/16"
+ ],
+ "subnets": [
+ {
+ "name": "AppSvcSubnet",
+ "addressPrefix": "10.2.1.0/24",
+ "udrName": null,
+ "nsgName": null,
+ "privateEndpointNetworkPolicies": "Enabled",
+ "privateLinkServiceNetworkPolicies": "Enabled",
+ "delegations": [
+ {
+ "name": "appservice",
+ "properties": {
+ "serviceName": "Microsoft.Web/serverFarms"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "variables": {
+ "suffix": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]",
+ "appName": "[concat('web-app-', uniqueString(subscription().id, resourceGroup().id))]-[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]",
+ "storagePrivateDnsZoneName": "[concat('privatelink.blob.', environment().suffixes.storage)]",
+ "sqlPrivateDnsZoneName": "[concat('privatelink', environment().suffixes.sqlServerHostname)]",
+ "sqlDatabaseName": "mydb01",
+ "storageContainerName": "mycontainer",
+ "storageGroupType": "blob",
+ "sqlGroupType": "sqlServer",
+ "vnetNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnets.json', parameters('_artifactsLocationSasToken')))]",
+ "vnetPeeringNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet_peering.json', parameters('_artifactsLocationSasToken')))]",
+ "appServicePlanNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/app_svc_plan.json', parameters('_artifactsLocationSasToken')))]",
+ "appNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/app.json', parameters('_artifactsLocationSasToken')))]",
+ "sqlNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/sqldb.json', parameters('_artifactsLocationSasToken')))]",
+ "privateLinkNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link.json', parameters('_artifactsLocationSasToken')))]",
+ "storageNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/storage.json', parameters('_artifactsLocationSasToken')))]",
+ "privateDnsNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_dns.json', parameters('_artifactsLocationSasToken')))]",
+ "privateDnsRecordNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/dns_record.json', parameters('_artifactsLocationSasToken')))]",
+ "privateLinkIpConfigsNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link_ipconfigs.json', parameters('_artifactsLocationSasToken')))]",
+ "privateLinkIpConfigsHelperNestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link_ipconfigs_helper.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "comments": "This deployment links to the vnets.json nested ARM template",
+ "name": "linkedTemplate-vnet-copyIndex()",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnets.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vNets": {
+ "value": "vNets)[copyIndex("
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the vnets.json nested ARM template",
+ "name": "linkedTemplate-vnet-copyIndex()",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnets.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vNets": {
+ "value": "vNets)[copyIndex("
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the vnet_peering.json nested ARM template",
+ "name": "linkedTemplate-peerings",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "vnetCopy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet_peering.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vNets": {
+ "value": [
+ {
+ "name": "hub-vnet",
+ "addressPrefixes": [
+ "10.1.0.0/16"
+ ],
+ "subnets": [
+ {
+ "name": "PrivateLinkSubnet",
+ "addressPrefix": "10.1.1.0/24",
+ "udrName": null,
+ "nsgName": null,
+ "delegations": null,
+ "privateEndpointNetworkPolicies": "Disabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ ]
+ },
+ {
+ "name": "spoke-vnet",
+ "addressPrefixes": [
+ "10.2.0.0/16"
+ ],
+ "subnets": [
+ {
+ "name": "AppSvcSubnet",
+ "addressPrefix": "10.2.1.0/24",
+ "udrName": null,
+ "nsgName": null,
+ "privateEndpointNetworkPolicies": "Enabled",
+ "privateLinkServiceNetworkPolicies": "Enabled",
+ "delegations": [
+ {
+ "name": "appservice",
+ "properties": {
+ "serviceName": "Microsoft.Web/serverFarms"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the app_svc_plan.json nested ARM template",
+ "name": "linkedTemplate-app-svc-plan",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "vnetCopy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/app_svc_plan.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "serverFarmSku": {
+ "value": {
+ "Tier": "Standard",
+ "Name": "S1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the app.json nested ARM template",
+ "name": "linkedTemplate-app",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-app-svc-plan"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/app.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "hostingPlanName": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-app-svc-plan')).outputs.serverFarmName.value]"
+ },
+ "subnet": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-vnet-1')).outputs.subnetResourceIds.value[0].id]"
+ },
+ "appName": {
+ "value": "[concat('web-app-', uniqueString(subscription().id, resourceGroup().id))]-[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "ipAddressRestriction": {
+ "value": [
+ "0.0.0.0/32"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the sqldb.json nested ARM template",
+ "name": "linkedTemplate-sqldb",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "vnetCopy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/sqldb.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "sqlAdministratorLogin": {
+ "value": "GEN-UNIQUE"
+ },
+ "sqlAdministratorLoginPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "databaseName": {
+ "value": "mydb01"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_link.json nested ARM template",
+ "name": "linkedTemplate-sqldb-private-link",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-sqldb"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "resourceType": {
+ "value": "Microsoft.Sql/servers"
+ },
+ "resourceName": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-sqldb')).outputs.sqlServerName.value]"
+ },
+ "groupType": {
+ "value": "sqlServer"
+ },
+ "subnet": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-vnet-0')).outputs.subnetResourceIds.value[0].id]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the storage.json nested ARM template",
+ "name": "linkedTemplate-storage",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "vnetCopy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/storage.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "containerName": {
+ "value": "mycontainer"
+ },
+ "defaultNetworkAccessAction": {
+ "value": "Deny"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_link.json nested ARM template",
+ "name": "linkedTemplate-storage-private-link",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-storage"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "suffix": {
+ "value": "[substring(replace(guid(resourceGroup().id), '-', ''), 0, 6)]"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "resourceType": {
+ "value": "Microsoft.Storage/storageAccounts"
+ },
+ "resourceName": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-storage')).outputs.storageAccountName.value]"
+ },
+ "groupType": {
+ "value": "blob"
+ },
+ "subnet": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-vnet-0')).outputs.subnetResourceIds.value[0].id]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_dns.json nested ARM template",
+ "name": "linkedTemplate-storage-private-dns-spoke-link",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-storage-private-link"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_dns.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "[variables('storagePrivateDnsZoneName')]"
+ },
+ "virtualNetworkName": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-vnet-1')).outputs.virtualNetworkName.value]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_dns.json nested ARM template",
+ "name": "linkedTemplate-storage-private-dns-hub-link",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-storage-private-link",
+ "linkedTemplate-storage-private-dns-spoke-link"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_dns.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "[variables('storagePrivateDnsZoneName')]"
+ },
+ "virtualNetworkName": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-vnet-0')).outputs.virtualNetworkName.value]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_link_ipconfigs.json nested ARM template",
+ "name": "linkedTemplate-storage-private-link-ipconfigs",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-storage-private-dns-hub-link"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link_ipconfigs.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "[variables('storagePrivateDnsZoneName')]"
+ },
+ "privateLinkNicResource": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-storage-private-link')).outputs.privateLinkNicResource.value]"
+ },
+ "privateDnsRecordTemplateUri": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/dns_record.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "privateLinkNicIpConfigTemplateUri": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link_ipconfigs_helper.json', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_dns.json nested ARM template",
+ "name": "linkedTemplate-sqldb-private-dns-spoke-link",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-sqldb-private-link"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_dns.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "[variables('sqlPrivateDnsZoneName')]"
+ },
+ "virtualNetworkName": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-vnet-1')).outputs.virtualNetworkName.value]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_dns.json nested ARM template",
+ "name": "linkedTemplate-sqldb-private-dns-hub-link",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-sqldb-private-link",
+ "linkedTemplate-sqldb-private-dns-spoke-link"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_dns.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "[variables('sqlPrivateDnsZoneName')]"
+ },
+ "virtualNetworkName": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-vnet-0')).outputs.virtualNetworkName.value]"
+ }
+ }
+ }
+ },
+ {
+ "comments": "This deployment links to the private_link_ipconfig.json nested ARM template",
+ "name": "linkedTemplate-sqldb-private-link-ipconfigs",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "linkedTemplate-sqldb-private-dns-hub-link"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link_ipconfigs.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "parameters": {
+ "privateDnsZoneName": {
+ "value": "[variables('sqlPrivateDnsZoneName')]"
+ },
+ "privateLinkNicResource": {
+ "value": "[reference(resourceId('Microsoft.Resources/deployments', 'linkedTemplate-sqldb-private-link')).outputs.privateLinkNicResource.value]"
+ },
+ "privateDnsRecordTemplateUri": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/dns_record.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "privateLinkNicIpConfigTemplateUri": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/private_link_ipconfigs_helper.json', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT877 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT877
new file mode 100644
index 0000000..278b29e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT877
@@ -0,0 +1,416 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-sql-docdb-search/azuredeploy.json",
+ "/demos/web-app-sql-docdb-search/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902435,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-sql-docdb-search/azuredeploy.json",
+ "/demos/web-app-sql-docdb-search/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT877",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites",
+ "microsoft.sql/servers",
+ "microsoft.documentdb/databaseaccounts",
+ "microsoft.search/searchservices",
+ "microsoft.storage/storageaccounts",
+ "microsoft.web/serverfarms",
+ "microsoft.insights/components"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT877",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "databaseAccountName": {
+ "type": "string",
+ "minLength": 3,
+ "metadata": {
+ "description": "The Azure Cosmos DB database account name."
+ },
+ "value": "GEN-UNIQUE-11"
+ },
+ "consistencyLevel": {
+ "type": "string",
+ "defaultValue": "Session",
+ "allowedValues": [
+ "Eventual",
+ "Strong",
+ "Session",
+ "BoundedStaleness"
+ ],
+ "metadata": {
+ "description": "The Azure Cosmos DB default consistency level for this account."
+ }
+ },
+ "maxStalenessPrefix": {
+ "type": "int",
+ "minValue": 10,
+ "maxValue": 1000,
+ "defaultValue": 10,
+ "metadata": {
+ "description": "When consistencyLevel is set to BoundedStaleness, then this value is required, otherwise it can be ignored."
+ }
+ },
+ "maxIntervalInSeconds": {
+ "type": "int",
+ "minValue": 5,
+ "maxValue": 600,
+ "defaultValue": 5,
+ "metadata": {
+ "description": "When consistencyLevel is set to BoundedStaleness, then this value is required, otherwise it can be ignored."
+ }
+ },
+ "sqlServerAdminLogin": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The SQL server admin username."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "sqlServerAdminLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The SQL server admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sqlDatabaseName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The SQL database name"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "sqlDatabaseCollation": {
+ "type": "string",
+ "minLength": 1,
+ "defaultValue": "SQL_Latin1_General_CP1_CI_AS",
+ "metadata": {
+ "description": "The SQL database collation"
+ }
+ },
+ "sqlDatabaseEdition": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "allowedValues": [
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The SQL server edition"
+ }
+ },
+ "sqldatabaseRequestedServiceObjectiveName": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "allowedValues": [
+ "Basic",
+ "S0",
+ "S1",
+ "S2",
+ "P1",
+ "P2",
+ "P3"
+ ],
+ "metadata": {
+ "description": "Describes the performance level for Edition"
+ }
+ },
+ "webAppName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the Web App"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "webAppSKU": {
+ "type": "string",
+ "defaultValue": "F1",
+ "allowedValues": [
+ "F1",
+ "D1",
+ "B1",
+ "S1"
+ ],
+ "metadata": {
+ "description": "The Web App pricing tier"
+ }
+ },
+ "workerSize": {
+ "type": "string",
+ "defaultValue": "0",
+ "allowedValues": [
+ "0",
+ "1",
+ "2"
+ ],
+ "metadata": {
+ "description": "The Web App worker size"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_ZRS",
+ "Standard_GRS",
+ "Standard_RAGRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The storage account type"
+ }
+ },
+ "azureSearchname": {
+ "type": "string",
+ "metadata": {
+ "description": "The azure search instance name"
+ },
+ "value": "GEN-UNIQUE-9"
+ },
+ "azureSearchSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standard",
+ "standard2"
+ ],
+ "metadata": {
+ "description": "The azure search instance tier."
+ }
+ },
+ "azureSearchReplicaCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "metadata": {
+ "description": "The number of search replicas"
+ }
+ },
+ "azureSearchPartitionCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 6,
+ 12
+ ],
+ "metadata": {
+ "description": "The number of search partitions"
+ }
+ },
+ "documentDBOfferType": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Standard"
+ ],
+ "metadata": {
+ "description": "The Azure Cosmos DB offer type"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "insightsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for Insights."
+ },
+ "value": "centralus"
+ }
+ },
+ "variables": {
+ "sqlServerName": "[concat(uniquestring(resourceGroup().id), 'sqlserver')]",
+ "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'storage')]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-09-01",
+ "type": "Microsoft.DocumentDB/databaseAccounts",
+ "name": "GEN-UNIQUE-11",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "DocumentDB"
+ },
+ "properties": {
+ "name": "GEN-UNIQUE-11",
+ "databaseAccountOfferType": "Standard",
+ "consistencyPolicy": {
+ "defaultConsistencyLevel": "Session",
+ "maxStalenessPrefix": 10,
+ "maxIntervalInSeconds": 5
+ },
+ "locations": [
+ {
+ "locationName": "[resourceGroup().location]",
+ "failoverPriority": 0
+ }
+ ]
+ }
+ },
+ {
+ "name": "[variables('sqlServerName')]",
+ "type": "Microsoft.Sql/servers",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01-preview",
+ "tags": {
+ "displayName": "SQL Server"
+ },
+ "properties": {
+ "administratorLogin": "GEN-UNIQUE-8",
+ "administratorLoginPassword": "GEN-PASSWORD",
+ "version": "12.0"
+ },
+ "resources": [
+ {
+ "name": "AllowAllWindowsAzureIps",
+ "type": "firewallrules",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01-preview",
+ "dependsOn": [
+ "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]"
+ ],
+ "properties": {
+ "startIpAddress": "0.0.0.0",
+ "endIpAddress": "0.0.0.0"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-8",
+ "type": "databases",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01-preview",
+ "dependsOn": [
+ "[variables('sqlServerName')]"
+ ],
+ "tags": {
+ "displayName": "SQL Database"
+ },
+ "properties": {
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "edition": "Basic",
+ "maxSizeBytes": "1073741824",
+ "requestedServiceObjectiveName": "Basic"
+ }
+ }
+ ]
+ },
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.Web/serverfarms",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "tags": {
+ "displayName": "App Service Plan"
+ },
+ "sku": {
+ "name": "F1"
+ },
+ "properties": {
+ "name": "GEN-UNIQUE-10",
+ "workerSize": "0",
+ "numberOfWorkers": 1
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.Web/sites",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Web/serverfarms/GEN-UNIQUE-10"
+ ],
+ "tags": {
+ "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('webAppName'))]": "Resource",
+ "displayName": "Web App"
+ },
+ "properties": {
+ "name": "GEN-UNIQUE-10",
+ "serverFarmId": "Microsoft.Web/serverfarms//GEN-UNIQUE-10"
+ },
+ "resources": []
+ },
+ {
+ "name": "[variables('storageAccountName')]",
+ "type": "Microsoft.Storage/storageAccounts",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-02-01",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-9",
+ "type": "Microsoft.Search/searchServices",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Azure Search"
+ },
+ "sku": {
+ "name": "azureSearchsku"
+ },
+ "properties": {
+ "replicaCount": "azureSearchreplicaCount",
+ "partitionCount": "azureSearchpartitionCount"
+ }
+ },
+ {
+ "name": "appinsights",
+ "type": "Microsoft.Insights/components",
+ "location": "centralus",
+ "apiVersion": "2020-02-02-preview",
+ "dependsOn": [
+ "Microsoft.Web/sites/GEN-UNIQUE-10"
+ ],
+ "tags": {
+ "displayName": "Application Insights"
+ },
+ "properties": {
+ "applicationId": "GEN-UNIQUE-10"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT878 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT878
new file mode 100644
index 0000000..ea987e2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT878
@@ -0,0 +1,416 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/web-app-sql-docdb-search/azuredeploy.json",
+ "/demos/web-app-sql-docdb-search/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962902441,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/web-app-sql-docdb-search/azuredeploy.json",
+ "/demos/web-app-sql-docdb-search/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT878",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites",
+ "microsoft.sql/servers",
+ "microsoft.documentdb/databaseaccounts",
+ "microsoft.search/searchservices",
+ "microsoft.storage/storageaccounts",
+ "microsoft.web/serverfarms",
+ "microsoft.insights/components"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT878",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "databaseAccountName": {
+ "type": "string",
+ "minLength": 3,
+ "metadata": {
+ "description": "The Azure Cosmos DB database account name."
+ },
+ "value": "GEN-UNIQUE-11"
+ },
+ "consistencyLevel": {
+ "type": "string",
+ "defaultValue": "Session",
+ "allowedValues": [
+ "Eventual",
+ "Strong",
+ "Session",
+ "BoundedStaleness"
+ ],
+ "metadata": {
+ "description": "The Azure Cosmos DB default consistency level for this account."
+ }
+ },
+ "maxStalenessPrefix": {
+ "type": "int",
+ "minValue": 10,
+ "maxValue": 1000,
+ "defaultValue": 10,
+ "metadata": {
+ "description": "When consistencyLevel is set to BoundedStaleness, then this value is required, otherwise it can be ignored."
+ }
+ },
+ "maxIntervalInSeconds": {
+ "type": "int",
+ "minValue": 5,
+ "maxValue": 600,
+ "defaultValue": 5,
+ "metadata": {
+ "description": "When consistencyLevel is set to BoundedStaleness, then this value is required, otherwise it can be ignored."
+ }
+ },
+ "sqlServerAdminLogin": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The SQL server admin username."
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "sqlServerAdminLoginPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The SQL server admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "sqlDatabaseName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The SQL database name"
+ },
+ "value": "GEN-UNIQUE-8"
+ },
+ "sqlDatabaseCollation": {
+ "type": "string",
+ "minLength": 1,
+ "defaultValue": "SQL_Latin1_General_CP1_CI_AS",
+ "metadata": {
+ "description": "The SQL database collation"
+ }
+ },
+ "sqlDatabaseEdition": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "allowedValues": [
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The SQL server edition"
+ }
+ },
+ "sqldatabaseRequestedServiceObjectiveName": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "allowedValues": [
+ "Basic",
+ "S0",
+ "S1",
+ "S2",
+ "P1",
+ "P2",
+ "P3"
+ ],
+ "metadata": {
+ "description": "Describes the performance level for Edition"
+ }
+ },
+ "webAppName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the Web App"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "webAppSKU": {
+ "type": "string",
+ "defaultValue": "F1",
+ "allowedValues": [
+ "F1",
+ "D1",
+ "B1",
+ "S1"
+ ],
+ "metadata": {
+ "description": "The Web App pricing tier"
+ }
+ },
+ "workerSize": {
+ "type": "string",
+ "defaultValue": "0",
+ "allowedValues": [
+ "0",
+ "1",
+ "2"
+ ],
+ "metadata": {
+ "description": "The Web App worker size"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_ZRS",
+ "Standard_GRS",
+ "Standard_RAGRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "The storage account type"
+ }
+ },
+ "azureSearchname": {
+ "type": "string",
+ "metadata": {
+ "description": "The azure search instance name"
+ },
+ "value": "GEN-UNIQUE-9"
+ },
+ "azureSearchSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standard",
+ "standard2"
+ ],
+ "metadata": {
+ "description": "The azure search instance tier."
+ }
+ },
+ "azureSearchReplicaCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "metadata": {
+ "description": "The number of search replicas"
+ }
+ },
+ "azureSearchPartitionCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 6,
+ 12
+ ],
+ "metadata": {
+ "description": "The number of search partitions"
+ }
+ },
+ "documentDBOfferType": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Standard"
+ ],
+ "metadata": {
+ "description": "The Azure Cosmos DB offer type"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "insightsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for Insights."
+ },
+ "value": "usgovvirginia"
+ }
+ },
+ "variables": {
+ "sqlServerName": "[concat(uniquestring(resourceGroup().id), 'sqlserver')]",
+ "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'storage')]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-09-01",
+ "type": "Microsoft.DocumentDB/databaseAccounts",
+ "name": "GEN-UNIQUE-11",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "DocumentDB"
+ },
+ "properties": {
+ "name": "GEN-UNIQUE-11",
+ "databaseAccountOfferType": "Standard",
+ "consistencyPolicy": {
+ "defaultConsistencyLevel": "Session",
+ "maxStalenessPrefix": 10,
+ "maxIntervalInSeconds": 5
+ },
+ "locations": [
+ {
+ "locationName": "[resourceGroup().location]",
+ "failoverPriority": 0
+ }
+ ]
+ }
+ },
+ {
+ "name": "[variables('sqlServerName')]",
+ "type": "Microsoft.Sql/servers",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01-preview",
+ "tags": {
+ "displayName": "SQL Server"
+ },
+ "properties": {
+ "administratorLogin": "GEN-UNIQUE-8",
+ "administratorLoginPassword": "GEN-PASSWORD",
+ "version": "12.0"
+ },
+ "resources": [
+ {
+ "name": "AllowAllWindowsAzureIps",
+ "type": "firewallrules",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01-preview",
+ "dependsOn": [
+ "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]"
+ ],
+ "properties": {
+ "startIpAddress": "0.0.0.0",
+ "endIpAddress": "0.0.0.0"
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-8",
+ "type": "databases",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-11-01-preview",
+ "dependsOn": [
+ "[variables('sqlServerName')]"
+ ],
+ "tags": {
+ "displayName": "SQL Database"
+ },
+ "properties": {
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "edition": "Basic",
+ "maxSizeBytes": "1073741824",
+ "requestedServiceObjectiveName": "Basic"
+ }
+ }
+ ]
+ },
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.Web/serverfarms",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "tags": {
+ "displayName": "App Service Plan"
+ },
+ "sku": {
+ "name": "F1"
+ },
+ "properties": {
+ "name": "GEN-UNIQUE-10",
+ "workerSize": "0",
+ "numberOfWorkers": 1
+ }
+ },
+ {
+ "name": "GEN-UNIQUE-10",
+ "type": "Microsoft.Web/sites",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Web/serverfarms/GEN-UNIQUE-10"
+ ],
+ "tags": {
+ "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('webAppName'))]": "Resource",
+ "displayName": "Web App"
+ },
+ "properties": {
+ "name": "GEN-UNIQUE-10",
+ "serverFarmId": "Microsoft.Web/serverfarms//GEN-UNIQUE-10"
+ },
+ "resources": []
+ },
+ {
+ "name": "[variables('storageAccountName')]",
+ "type": "Microsoft.Storage/storageAccounts",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2021-02-01",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE-9",
+ "type": "Microsoft.Search/searchServices",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Azure Search"
+ },
+ "sku": {
+ "name": "azureSearchsku"
+ },
+ "properties": {
+ "replicaCount": "azureSearchreplicaCount",
+ "partitionCount": "azureSearchpartitionCount"
+ }
+ },
+ {
+ "name": "appinsights",
+ "type": "Microsoft.Insights/components",
+ "location": "usgovvirginia",
+ "apiVersion": "2020-02-02-preview",
+ "dependsOn": [
+ "Microsoft.Web/sites/GEN-UNIQUE-10"
+ ],
+ "tags": {
+ "displayName": "Application Insights"
+ },
+ "properties": {
+ "applicationId": "GEN-UNIQUE-10"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT879 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT879
new file mode 100644
index 0000000..b546ccc
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT879
@@ -0,0 +1,763 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/disksSelector.json"
+ ],
+ "timestamp": 1642962902467,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/disksSelector.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT879",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": []
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT879",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "numDataDisks": {
+ "type": "string",
+ "allowedValues": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "32",
+ "64"
+ ],
+ "metadata": {
+ "description": "This parameter allows the user to select the number of disks they want"
+ }
+ },
+ "diskCaching": {
+ "type": "string",
+ "allowedValues": [
+ "None",
+ "ReadOnly",
+ "ReadWrite"
+ ],
+ "metadata": {
+ "description": "Caching type for the data disks"
+ }
+ },
+ "diskSizeGB": {
+ "type": "int",
+ "minValue": 1,
+ "maxValue": 1023,
+ "metadata": {
+ "description": "Size of the data disks"
+ }
+ }
+ },
+ "variables": {
+ "disksArray": {
+ "1": "(dataDisks)[1]",
+ "2": "[concat(variables('dataDisks')['1'], variables('dataDisks')['2'])]",
+ "3": "[concat(variables('dataDisks')['1'], variables('dataDisks')['2'], variables('dataDisks')['3'])]",
+ "4": "(diskDeltas)[4delta]",
+ "5": "[concat(variables('diskDeltas')['4delta'], variables('dataDisks')['5'])]",
+ "6": "[concat(variables('diskDeltas')['4delta'], variables('dataDisks')['5'], variables('dataDisks')['6'])]",
+ "7": "[concat(variables('diskDeltas')['4delta'], variables('dataDisks')['5'], variables('dataDisks')['6'], variables('dataDisks')['7'])]",
+ "8": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'])]",
+ "9": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('dataDisks')['9'])]",
+ "10": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('dataDisks')['9'], variables('dataDisks')['10'])]",
+ "11": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('dataDisks')['9'], variables('dataDisks')['10'], variables('dataDisks')['11'])]",
+ "12": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('diskDeltas')['12delta'])]",
+ "13": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('diskDeltas')['12delta'], variables('dataDisks')['13'])]",
+ "14": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('diskDeltas')['12delta'], variables('dataDisks')['13'], variables('dataDisks')['14'])]",
+ "15": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('diskDeltas')['12delta'], variables('dataDisks')['13'], variables('dataDisks')['14'], variables('dataDisks')['15'])]",
+ "16": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('diskDeltas')['12delta'], variables('diskDeltas')['16delta'])]",
+ "32": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('diskDeltas')['12delta'], variables('diskDeltas')['16delta'], variables('diskDeltas')['32delta'])]",
+ "64": "[concat(variables('diskDeltas')['4delta'], variables('diskDeltas')['8delta'], variables('diskDeltas')['12delta'], variables('diskDeltas')['16delta'], variables('diskDeltas')['32delta'], variables('diskDeltas')['64delta'])]"
+ },
+ "dataDisks": {
+ "1": [
+ {
+ "name": "datadisk1",
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "2": [
+ {
+ "name": "datadisk2",
+ "lun": 1,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "3": [
+ {
+ "name": "datadisk3",
+ "lun": 2,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "4": [
+ {
+ "name": "datadisk4",
+ "lun": 3,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "5": [
+ {
+ "name": "datadisk5",
+ "lun": 4,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "6": [
+ {
+ "name": "datadisk6",
+ "lun": 5,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "7": [
+ {
+ "name": "datadisk7",
+ "lun": 6,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "8": [
+ {
+ "name": "datadisk8",
+ "lun": 7,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "9": [
+ {
+ "name": "datadisk9",
+ "lun": 8,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "10": [
+ {
+ "name": "datadisk10",
+ "lun": 9,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "11": [
+ {
+ "name": "datadisk11",
+ "lun": 10,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "12": [
+ {
+ "name": "datadisk12",
+ "lun": 11,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "13": [
+ {
+ "name": "datadisk13",
+ "lun": 12,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "14": [
+ {
+ "name": "datadisk14",
+ "lun": 13,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "15": [
+ {
+ "name": "datadisk15",
+ "lun": 14,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "16": [
+ {
+ "name": "datadisk16",
+ "lun": 15,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "17": [
+ {
+ "name": "datadisk17",
+ "lun": 16,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "18": [
+ {
+ "name": "datadisk18",
+ "lun": 17,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "19": [
+ {
+ "name": "datadisk19",
+ "lun": 18,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "20": [
+ {
+ "name": "datadisk20",
+ "lun": 19,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "21": [
+ {
+ "name": "datadisk21",
+ "lun": 20,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "22": [
+ {
+ "name": "datadisk22",
+ "lun": 21,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "23": [
+ {
+ "name": "datadisk23",
+ "lun": 22,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "24": [
+ {
+ "name": "datadisk24",
+ "lun": 23,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "25": [
+ {
+ "name": "datadisk25",
+ "lun": 24,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "26": [
+ {
+ "name": "datadisk26",
+ "lun": 25,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "27": [
+ {
+ "name": "datadisk27",
+ "lun": 26,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "28": [
+ {
+ "name": "datadisk28",
+ "lun": 27,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "29": [
+ {
+ "name": "datadisk29",
+ "lun": 28,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "30": [
+ {
+ "name": "datadisk30",
+ "lun": 29,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "31": [
+ {
+ "name": "datadisk31",
+ "lun": 30,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "32": [
+ {
+ "name": "datadisk32",
+ "lun": 31,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "33": [
+ {
+ "name": "datadisk33",
+ "lun": 32,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "34": [
+ {
+ "name": "datadisk34",
+ "lun": 33,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "35": [
+ {
+ "name": "datadisk35",
+ "lun": 34,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "36": [
+ {
+ "name": "datadisk36",
+ "lun": 35,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "37": [
+ {
+ "name": "datadisk37",
+ "lun": 36,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "38": [
+ {
+ "name": "datadisk38",
+ "lun": 37,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "39": [
+ {
+ "name": "datadisk39",
+ "lun": 38,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "40": [
+ {
+ "name": "datadisk40",
+ "lun": 39,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "41": [
+ {
+ "name": "datadisk41",
+ "lun": 40,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "42": [
+ {
+ "name": "datadisk42",
+ "lun": 41,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "43": [
+ {
+ "name": "datadisk43",
+ "lun": 42,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "44": [
+ {
+ "name": "datadisk44",
+ "lun": 43,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "45": [
+ {
+ "name": "datadisk45",
+ "lun": 44,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "46": [
+ {
+ "name": "datadisk46",
+ "lun": 45,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "47": [
+ {
+ "name": "datadisk47",
+ "lun": 46,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "48": [
+ {
+ "name": "datadisk48",
+ "lun": 47,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "49": [
+ {
+ "name": "datadisk49",
+ "lun": 48,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "50": [
+ {
+ "name": "datadisk50",
+ "lun": 49,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "51": [
+ {
+ "name": "datadisk51",
+ "lun": 50,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "52": [
+ {
+ "name": "datadisk52",
+ "lun": 51,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "53": [
+ {
+ "name": "datadisk53",
+ "lun": 52,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "54": [
+ {
+ "name": "datadisk54",
+ "lun": 53,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "55": [
+ {
+ "name": "datadisk55",
+ "lun": 54,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "56": [
+ {
+ "name": "datadisk56",
+ "lun": 55,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "57": [
+ {
+ "name": "datadisk57",
+ "lun": 56,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "58": [
+ {
+ "name": "datadisk58",
+ "lun": 57,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "59": [
+ {
+ "name": "datadisk59",
+ "lun": 58,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "60": [
+ {
+ "name": "datadisk60",
+ "lun": 59,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "61": [
+ {
+ "name": "datadisk61",
+ "lun": 60,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "62": [
+ {
+ "name": "datadisk62",
+ "lun": 61,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "63": [
+ {
+ "name": "datadisk63",
+ "lun": 62,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ],
+ "64": [
+ {
+ "name": "datadisk64",
+ "lun": 63,
+ "createOption": "Empty",
+ "caching": "diskCaching",
+ "diskSizeGB": "diskSizeGB"
+ }
+ ]
+ },
+ "diskDeltas": {
+ "4delta": [
+ "(dataDisks)[1][0]",
+ "(dataDisks)[2][0]",
+ "(dataDisks)[3][0]",
+ "(dataDisks)[4][0]"
+ ],
+ "8delta": [
+ "(dataDisks)[5][0]",
+ "(dataDisks)[6][0]",
+ "(dataDisks)[7][0]",
+ "(dataDisks)[8][0]"
+ ],
+ "12delta": [
+ "(dataDisks)[9][0]",
+ "(dataDisks)[10][0]",
+ "(dataDisks)[11][0]",
+ "(dataDisks)[12][0]"
+ ],
+ "16delta": [
+ "(dataDisks)[13][0]",
+ "(dataDisks)[14][0]",
+ "(dataDisks)[15][0]",
+ "(dataDisks)[16][0]"
+ ],
+ "32delta": [
+ "(dataDisks)[17][0]",
+ "(dataDisks)[18][0]",
+ "(dataDisks)[19][0]",
+ "(dataDisks)[20][0]",
+ "(dataDisks)[21][0]",
+ "(dataDisks)[22][0]",
+ "(dataDisks)[23][0]",
+ "(dataDisks)[24][0]",
+ "(dataDisks)[25][0]",
+ "(dataDisks)[26][0]",
+ "(dataDisks)[27][0]",
+ "(dataDisks)[28][0]",
+ "(dataDisks)[29][0]",
+ "(dataDisks)[30][0]",
+ "(dataDisks)[31][0]",
+ "(dataDisks)[32][0]"
+ ],
+ "64delta": [
+ "(dataDisks)[33][0]",
+ "(dataDisks)[34][0]",
+ "(dataDisks)[35][0]",
+ "(dataDisks)[36][0]",
+ "(dataDisks)[37][0]",
+ "(dataDisks)[38][0]",
+ "(dataDisks)[39][0]",
+ "(dataDisks)[40][0]",
+ "(dataDisks)[41][0]",
+ "(dataDisks)[42][0]",
+ "(dataDisks)[43][0]",
+ "(dataDisks)[44][0]",
+ "(dataDisks)[45][0]",
+ "(dataDisks)[46][0]",
+ "(dataDisks)[47][0]",
+ "(dataDisks)[48][0]",
+ "(dataDisks)[49][0]",
+ "(dataDisks)[50][0]",
+ "(dataDisks)[51][0]",
+ "(dataDisks)[52][0]",
+ "(dataDisks)[53][0]",
+ "(dataDisks)[54][0]",
+ "(dataDisks)[55][0]",
+ "(dataDisks)[56][0]",
+ "(dataDisks)[57][0]",
+ "(dataDisks)[58][0]",
+ "(dataDisks)[59][0]",
+ "(dataDisks)[60][0]",
+ "(dataDisks)[61][0]",
+ "(dataDisks)[62][0]",
+ "(dataDisks)[63][0]",
+ "(dataDisks)[64][0]"
+ ]
+ }
+ },
+ "resources": [],
+ "outputs": {
+ "dataDiskArray": {
+ "type": "array",
+ "value": "[variables('disksArray')[parameters('numDataDisks')]]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT88 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT88
new file mode 100644
index 0000000..249f918
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT88
@@ -0,0 +1,317 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/vm-5-datadisks.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962885845,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-on-centos/vm-5-datadisks.json",
+ "/application-workloads/cloudera/cloudera-on-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT88",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT88",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "numberOfDataNodes": {
+ "value": 3
+ },
+ "masterStorageAccountType": {
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "subnetName": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "tshirtSize": {
+ "value": "Eval"
+ },
+ "vmSize": {
+ "value": "Standard_D16s_v3"
+ },
+ "vmImage": {
+ "value": "ClouderaCentOS6_7"
+ },
+ "company": {
+ "value": "company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Storage"
+ }
+ },
+ "variables": {
+ "singleQuote": "'",
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "GEN-UNIQUE-10-dn",
+ "nicName": "GEN-UNIQUE-10-dn-nic",
+ "publicIPAddressName": "GEN-UNIQUE-10-dn-publicIP",
+ "securityGroupName": "GEN-UNIQUE-10-dn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "GEN-UNIQUE-10-dn-sg",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE-10-dncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "GEN-UNIQUE-10-dn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ ],
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-10-dn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/GEN-UNIQUE-10-dn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2017-03-30",
+ "name": "GEN-UNIQUE-10-dncopyIndex()",
+ "plan": "vmSpec",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": false
+ }
+ },
+ "storageProfile": {
+ "imageReference": "vmSpec",
+ "osDisk": {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk1",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk2",
+ "diskSizeGB": 1023,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk3",
+ "diskSizeGB": 1023,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk4",
+ "diskSizeGB": 1023,
+ "lun": 3,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk5",
+ "diskSizeGB": 1023,
+ "lun": 4,
+ "createOption": "Empty"
+ },
+ {
+ "name": "GEN-UNIQUE-10-dncopyIndex()_DataDisk6",
+ "diskSizeGB": 1023,
+ "lun": 5,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/GEN-UNIQUE-10-dn-niccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "GEN-UNIQUE-10-dncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/GEN-UNIQUE-10-dncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-datanode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh ', variables('singleQuote'), variables('masterIP'), variables('singleQuote'), ' ', variables('singleQuote'), variables('workerIP'), variables('singleQuote'), ' ', variables('singleQuote'), parameters('dnsNamePrefix'), variables('singleQuote'), ' ', variables('singleQuote'), reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').masterNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('clusterSpec').dataNodeCount, variables('singleQuote'), ' ', variables('singleQuote'), parameters('vmSpec').adminUsername, variables('singleQuote'), ' ', 'datanode', ' >> /var/log/cloudera-azure-initialize.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT880 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT880
new file mode 100644
index 0000000..048ba7a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT880
@@ -0,0 +1,292 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/lb-resources.json"
+ ],
+ "timestamp": 1642962902477,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/lb-resources.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT880",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT880",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string"
+ },
+ "namespace": {
+ "type": "string"
+ },
+ "webNodeCount": {
+ "type": "int"
+ },
+ "vmbasename": {
+ "type": "string"
+ },
+ "dnsname": {
+ "type": "string"
+ },
+ "osSettings": {
+ "type": "object"
+ },
+ "sizeOfDataDiskInGB": {
+ "type": "int"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "zabbixServerIPAddress": {
+ "type": "string"
+ },
+ "subnet": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet",
+ "securityGroupName": "namespacevmbasenamensg",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/adminUsername/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "namespacevmbasenamensg",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http",
+ "properties": {
+ "description": "Allows Http traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent1",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10051",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "namespacevmbasenamePublicIp",
+ "location": "location",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsname"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "namespacevmbasenamenic",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//namespacevmbasenamePublicIp",
+ "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/namespacevmbasenamePublicIp"
+ },
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "namespacevmbasenamevm",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//namespacevmbasenamenic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmbasenamevm",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "osSettings",
+ "dataDisks": [
+ {
+ "name": "namespacevmbasenamevm_DataDisk1",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "ReadWrite"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk2",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 1,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk3",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 2,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk4",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 3,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ }
+ ],
+ "osDisk": {
+ "name": "namespacevmbasenamevm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/namespacevmbasenamenic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namespacevmbasenamevm/lbInstall",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//namespacevmbasenamevm",
+ "Microsoft.Network/networkInterfaces//namespacevmbasenamenic"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "osSettings"
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash lb.sh webNodeCount zabbixServerIPAddress"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT881 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT881
new file mode 100644
index 0000000..62d0760
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT881
@@ -0,0 +1,271 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/mysqlMaster-resources.json"
+ ],
+ "timestamp": 1642962902485,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/mysqlMaster-resources.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT881",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT881",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string"
+ },
+ "mysqlPassword": {
+ "type": "securestring"
+ },
+ "namespace": {
+ "type": "string"
+ },
+ "vmbasename": {
+ "type": "string"
+ },
+ "osSettings": {
+ "type": "object"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "sizeOfDataDiskInGB": {
+ "type": "int"
+ },
+ "subnet": {
+ "type": "object"
+ },
+ "zabbixServerIPAddress": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet",
+ "securityGroupName": "namespacevmbasenamensg",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/adminUsername/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "namespacevmbasenamensg",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "mysql",
+ "properties": {
+ "description": "Allows MySQL traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3306",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent1",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10051",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "namespacevmbasenamenic",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "namespacevmbasenamevm",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//namespacevmbasenamenic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmbasenamevm",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "osSettings",
+ "dataDisks": [
+ {
+ "name": "namespacevmbasenamevm_DataDisk1",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "ReadWrite"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk2",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 1,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk3",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 2,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk4",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 3,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ }
+ ],
+ "osDisk": {
+ "name": "namespacevmbasenamevm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/namespacevmbasenamenic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namespacevmbasenamevm/mysqlMasterInstall",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//namespacevmbasenamevm"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "osSettings"
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash mysqlMaster.sh mysqlPassword zabbixServerIPAddress"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT882 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT882
new file mode 100644
index 0000000..23b8db5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT882
@@ -0,0 +1,271 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/mysqlSlave-resources.json"
+ ],
+ "timestamp": 1642962902491,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/mysqlSlave-resources.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT882",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT882",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string"
+ },
+ "mysqlPassword": {
+ "type": "securestring"
+ },
+ "namespace": {
+ "type": "string"
+ },
+ "vmbasename": {
+ "type": "string"
+ },
+ "osSettings": {
+ "type": "object"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "sizeOfDataDiskInGB": {
+ "type": "int"
+ },
+ "subnet": {
+ "type": "object"
+ },
+ "zabbixServerIPAddress": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet",
+ "securityGroupName": "namespacevmbasenamensg",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/adminUsername/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "namespacevmbasenamensg",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "mysql",
+ "properties": {
+ "description": "Allows MySQL traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3306",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent1",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10051",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "namespacevmbasenamenic",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "namespacevmbasenamevm",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//namespacevmbasenamenic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmbasenamevm",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "osSettings",
+ "dataDisks": [
+ {
+ "name": "namespacevmbasenamevm_DataDisk1",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "ReadWrite"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk2",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 1,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk3",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 2,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk4",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 3,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ }
+ ],
+ "osDisk": {
+ "name": "namespacevmbasenamevm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/namespacevmbasenamenic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namespacevmbasenamevm/mysqlSlaveInstall",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//namespacevmbasenamevm"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "osSettings"
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash mysqlSlave.sh mysqlPassword zabbixServerIPAddress"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT883 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT883
new file mode 100644
index 0000000..2486627
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT883
@@ -0,0 +1,268 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/redisMaster-resources.json"
+ ],
+ "timestamp": 1642962902498,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/redisMaster-resources.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT883",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT883",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string"
+ },
+ "namespace": {
+ "type": "string"
+ },
+ "vmbasename": {
+ "type": "string"
+ },
+ "osSettings": {
+ "type": "object"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "sizeOfDataDiskInGB": {
+ "type": "int"
+ },
+ "subnet": {
+ "type": "object"
+ },
+ "zabbixServerIPAddress": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet",
+ "securityGroupName": "namespacevmbasenamensg",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/adminUsername/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "namespacevmbasenamensg",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "redis",
+ "properties": {
+ "description": "Allows Redis traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6379",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent1",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10051",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "namespacevmbasenamenic",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "namespacevmbasenamevm",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//namespacevmbasenamenic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmbasenamevm",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "osSettings",
+ "dataDisks": [
+ {
+ "name": "namespacevmbasenamevm_DataDisk1",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "ReadWrite"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk2",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 1,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk3",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 2,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk4",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 3,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ }
+ ],
+ "osDisk": {
+ "name": "namespacevmbasenamevm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/namespacevmbasenamenic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namespacevmbasenamevm/redisMasterInstall",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//namespacevmbasenamevm"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "osSettings"
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash redisMaster.sh zabbixServerIPAddress"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT884 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT884
new file mode 100644
index 0000000..400832b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT884
@@ -0,0 +1,268 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/redisSlave-resources.json"
+ ],
+ "timestamp": 1642962902504,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/redisSlave-resources.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT884",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT884",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string"
+ },
+ "namespace": {
+ "type": "string"
+ },
+ "vmbasename": {
+ "type": "string"
+ },
+ "osSettings": {
+ "type": "object"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "sizeOfDataDiskInGB": {
+ "type": "int"
+ },
+ "subnet": {
+ "type": "object"
+ },
+ "zabbixServerIPAddress": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet",
+ "securityGroupName": "namespacevmbasenamensg",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/adminUsername/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "namespacevmbasenamensg",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "redis",
+ "properties": {
+ "description": "Allows Redis traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6379",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent1",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10051",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "namespacevmbasenamenic",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "namespacevmbasenamevm",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//namespacevmbasenamenic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmbasenamevm",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "osSettings",
+ "dataDisks": [
+ {
+ "name": "namespacevmbasenamevm_DataDisk1",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "ReadWrite"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk2",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 1,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk3",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 2,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk4",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 3,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ }
+ ],
+ "osDisk": {
+ "name": "namespacevmbasenamevm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/namespacevmbasenamenic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namespacevmbasenamevm/redisSlaveInstall",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//namespacevmbasenamevm"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "osSettings"
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash redisSlave.sh zabbixServerIPAddress"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT885 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT885
new file mode 100644
index 0000000..7f064c8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT885
@@ -0,0 +1,108 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/shared-resources.json"
+ ],
+ "timestamp": 1642962902511,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/shared-resources.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT885",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT885",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "networkSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Network settings object"
+ }
+ },
+ "namespace": {
+ "type": "string",
+ "metadata": {
+ "Description": "namespace"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "namespaceset",
+ "location": "location",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "networkSettings",
+ "location": "location",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "networkSettings"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "networkSettings",
+ "properties": {
+ "addressPrefix": "networkSettings"
+ }
+ },
+ {
+ "name": "networkSettings",
+ "properties": {
+ "addressPrefix": "networkSettings"
+ }
+ },
+ {
+ "name": "networkSettings",
+ "properties": {
+ "addressPrefix": "networkSettings"
+ }
+ },
+ {
+ "name": "networkSettings",
+ "properties": {
+ "addressPrefix": "networkSettings"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT886 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT886
new file mode 100644
index 0000000..6d72f58
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT886
@@ -0,0 +1,271 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/nested/web-resources.json"
+ ],
+ "timestamp": 1642962902516,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/nested/web-resources.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT886",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT886",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string"
+ },
+ "mysqlPassword": {
+ "type": "securestring"
+ },
+ "namespace": {
+ "type": "string"
+ },
+ "vmbasename": {
+ "type": "string"
+ },
+ "osSettings": {
+ "type": "object"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "sizeOfDataDiskInGB": {
+ "type": "int"
+ },
+ "subnet": {
+ "type": "object"
+ },
+ "zabbixServerIPAddress": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring"
+ }
+ },
+ "variables": {
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet",
+ "securityGroupName": "namespacevmbasenamensg",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/adminUsername/.ssh/authorized_keys",
+ "keyData": "adminPasswordOrKey"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "namespacevmbasenamensg",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http",
+ "properties": {
+ "description": "Allows Web traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "zabbixAgent1",
+ "properties": {
+ "description": "Allows zabbix monitoring",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10051",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "namespacevmbasenamenic",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/subnet/subnet"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/namespacevmbasenamensg"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "namespacevmbasenamevm",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//namespacevmbasenamenic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "vmbasenamevm",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPasswordOrKey",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "osSettings",
+ "dataDisks": [
+ {
+ "name": "namespacevmbasenamevm_DataDisk1",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 0,
+ "createOption": "Empty",
+ "caching": "ReadWrite"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk2",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 1,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk3",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 2,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ },
+ {
+ "name": "namespacevmbasenamevm_DataDisk4",
+ "diskSizeGB": "sizeOfDataDiskInGB",
+ "lun": 3,
+ "caching": "ReadWrite",
+ "createOption": "Empty"
+ }
+ ],
+ "osDisk": {
+ "name": "namespacevmbasenamevm_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/namespacevmbasenamenic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "namespacevmbasenamevm/webInstall",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//namespacevmbasenamevm"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "osSettings"
+ },
+ "protectedSettings": {
+ "commandToExecute": "bash web.sh mysqlPassword adminUsername zabbixServerIPAddress"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT887 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT887
new file mode 100644
index 0000000..c774b7f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT887
@@ -0,0 +1,708 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/website-cluster-centos/azuredeploy.json",
+ "/demos/website-cluster-centos/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902524,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/website-cluster-centos/azuredeploy.json",
+ "/demos/website-cluster-centos/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT887",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT887",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Administrator user name used when provisioning virtual machines"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "mysqlPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "MySQL password used when provisioning MySQL Clusters"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS Name for the publicly accessible primary node. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "centOsVersion": {
+ "type": "string",
+ "defaultValue": "7.0",
+ "allowedValues": [
+ "6.5",
+ "6.6",
+ "6.7",
+ "7.0",
+ "7.1",
+ "7.2"
+ ],
+ "metadata": {
+ "description": "The CentOS version for the VM. This will pick a fully patched image of this given CentOS version."
+ },
+ "value": "7.2"
+ },
+ "webNodeCount": {
+ "type": "int",
+ "minValue": 1,
+ "maxValue": 11,
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Number of web server nodes"
+ },
+ "value": 3
+ },
+ "zabbixServerIPAddress": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The zabbix server IP which will monitor the nodes' status. Null means no zabbix server."
+ },
+ "value": "Null"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "lbNodeVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the load balancer node."
+ }
+ },
+ "webNodeVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the web node."
+ }
+ },
+ "dbNodeVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the database node."
+ }
+ }
+ },
+ "variables": {
+ "sharedTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/shared-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "lbTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/lb-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "webTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/web-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "redisMasterTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/redisMaster-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "redisSlaveTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/redisSlave-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "mysqlMasterTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/mysqlMaster-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "mysqlSlaveTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('nested/mysqlSlave-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "lbNodeScript": "[uri(parameters('_artifactsLocation'), concat('scripts/lb.sh', parameters('_artifactsLocationSasToken')))]",
+ "webNodeScript": "[uri(parameters('_artifactsLocation'), concat('scripts/web.sh', parameters('_artifactsLocationSasToken')))]",
+ "redisMasterNodeScript": "[uri(parameters('_artifactsLocation'), concat('scripts/redisMaster.sh', parameters('_artifactsLocationSasToken')))]",
+ "redisSlaveNodeScript": "[uri(parameters('_artifactsLocation'), concat('scripts/redisSlave.sh', parameters('_artifactsLocationSasToken')))]",
+ "mysqlMasterNodeScript": "[uri(parameters('_artifactsLocation'), concat('scripts/mysqlMaster.sh', parameters('_artifactsLocationSasToken')))]",
+ "mysqlSlaveNodeScript": "[uri(parameters('_artifactsLocation'), concat('scripts/mysqlSlave.sh', parameters('_artifactsLocationSasToken')))]",
+ "namespace": "websiteCluster-",
+ "virtualNetworkName": "[concat('vnet-', uniqueString(resourceGroup().id))]",
+ "sizeOfDataDiskInGB": 100,
+ "networkSettings": {
+ "virtualNetworkName": "[variables('virtualNetworkName')]",
+ "addressPrefix": "10.0.0.0/24",
+ "subnet": {
+ "web": {
+ "name": "web",
+ "prefix": "10.0.0.0/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ },
+ "mysql": {
+ "name": "mysql",
+ "prefix": "10.0.0.16/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ },
+ "redis": {
+ "name": "redis",
+ "prefix": "10.0.0.32/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ },
+ "haproxy": {
+ "name": "haproxy",
+ "prefix": "10.0.0.48/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ }
+ },
+ "statics": {
+ "clusterRange": {
+ "base": "10.0.0.",
+ "start": 5
+ },
+ "primaryIp": "10.0.0.240"
+ }
+ },
+ "lbOsSettings": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/lb.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "webOsSettings": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/web.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "redisMasterOsSettings": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/redisMaster.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "redisSlaveOsSettings": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/redisSlave.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "mysqlMasterOsSettings": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/mysqlMaster.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ },
+ "mysqlSlaveOsSettings": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/mysqlSlave.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "shared",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/shared-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "networkSettings": {
+ "value": {
+ "virtualNetworkName": "[variables('virtualNetworkName')]",
+ "addressPrefix": "10.0.0.0/24",
+ "subnet": {
+ "web": {
+ "name": "web",
+ "prefix": "10.0.0.0/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ },
+ "mysql": {
+ "name": "mysql",
+ "prefix": "10.0.0.16/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ },
+ "redis": {
+ "name": "redis",
+ "prefix": "10.0.0.32/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ },
+ "haproxy": {
+ "name": "haproxy",
+ "prefix": "10.0.0.48/28",
+ "vnet": "[variables('virtualNetworkName')]"
+ }
+ },
+ "statics": {
+ "clusterRange": {
+ "base": "10.0.0.",
+ "start": 5
+ },
+ "primaryIp": "10.0.0.240"
+ }
+ }
+ },
+ "namespace": {
+ "value": "websiteCluster-"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "name": "webNodecopyindex()",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared"
+ ],
+ "copy": {
+ "name": "vmLoop",
+ "count": 3
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/web-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "mysqlPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "namespace": {
+ "value": "websiteCluster-"
+ },
+ "vmbasename": {
+ "value": "webcopyindex()"
+ },
+ "subnet": {
+ "value": "(networkSettings).subnet.web"
+ },
+ "sizeOfDataDiskInGB": {
+ "value": 100
+ },
+ "vmSize": {
+ "value": "Standard_D2_v3"
+ },
+ "zabbixServerIPAddress": {
+ "value": "Null"
+ },
+ "osSettings": {
+ "value": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/web.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "name": "redisMasterNode",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/redisMaster-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "namespace": {
+ "value": "websiteCluster-"
+ },
+ "vmbasename": {
+ "value": "redisMaster"
+ },
+ "subnet": {
+ "value": "(networkSettings).subnet.redis"
+ },
+ "sizeOfDataDiskInGB": {
+ "value": 100
+ },
+ "vmSize": {
+ "value": "Standard_D2_v3"
+ },
+ "zabbixServerIPAddress": {
+ "value": "Null"
+ },
+ "osSettings": {
+ "value": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/redisMaster.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "name": "redisSlaveNode",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared",
+ "Microsoft.Resources/deployments//redisMasterNode"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/redisSlave-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "namespace": {
+ "value": "websiteCluster-"
+ },
+ "vmbasename": {
+ "value": "redisSlave"
+ },
+ "subnet": {
+ "value": "(networkSettings).subnet.redis"
+ },
+ "sizeOfDataDiskInGB": {
+ "value": 100
+ },
+ "vmSize": {
+ "value": "Standard_D2_v3"
+ },
+ "zabbixServerIPAddress": {
+ "value": "Null"
+ },
+ "osSettings": {
+ "value": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/redisSlave.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "name": "mysqlMasterNode",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/mysqlMaster-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "mysqlPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "namespace": {
+ "value": "websiteCluster-"
+ },
+ "vmbasename": {
+ "value": "mysqlMaster"
+ },
+ "subnet": {
+ "value": "(networkSettings).subnet.mysql"
+ },
+ "sizeOfDataDiskInGB": {
+ "value": 100
+ },
+ "vmSize": {
+ "value": "Standard_D2_v3"
+ },
+ "zabbixServerIPAddress": {
+ "value": "Null"
+ },
+ "osSettings": {
+ "value": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/mysqlMaster.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "name": "mysqlSlaveNode",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared",
+ "Microsoft.Resources/deployments//mysqlMasterNode"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/mysqlSlave-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "mysqlPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "namespace": {
+ "value": "websiteCluster-"
+ },
+ "vmbasename": {
+ "value": "mysqlSlave"
+ },
+ "subnet": {
+ "value": "(networkSettings).subnet.mysql"
+ },
+ "sizeOfDataDiskInGB": {
+ "value": 100
+ },
+ "vmSize": {
+ "value": "Standard_D2_v3"
+ },
+ "zabbixServerIPAddress": {
+ "value": "Null"
+ },
+ "osSettings": {
+ "value": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/mysqlSlave.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "name": "lbNode",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared",
+ "Microsoft.Resources/deployments//mysqlSlaveNode"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/lb-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "namespace": {
+ "value": "websiteCluster-"
+ },
+ "vmbasename": {
+ "value": "lb"
+ },
+ "dnsname": {
+ "value": "GEN-UNIQUE"
+ },
+ "subnet": {
+ "value": "(networkSettings).subnet.haproxy"
+ },
+ "sizeOfDataDiskInGB": {
+ "value": 100
+ },
+ "webNodeCount": {
+ "value": 3
+ },
+ "vmSize": {
+ "value": "Standard_D2_v3"
+ },
+ "zabbixServerIPAddress": {
+ "value": "Null"
+ },
+ "osSettings": {
+ "value": {
+ "imageReference": {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.2",
+ "version": "latest"
+ },
+ "scripts": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/lb.sh', parameters('_artifactsLocationSasToken')))]"
+ ]
+ }
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT888 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT888
new file mode 100644
index 0000000..0fd004d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT888
@@ -0,0 +1,400 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.loganalytics/workspaces.json"
+ ],
+ "timestamp": 1642962902531,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.loganalytics/workspaces.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT888",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationsmanagement/solutions",
+ "microsoft.operationalinsights/workspaces/datasources"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT888",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "omsWorkspaceName": {
+ "type": "string",
+ "defaultValue": "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ },
+ "omsSolutionsName": {
+ "type": "array"
+ },
+ "tags": {
+ "type": "object"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Free",
+ "Standalone",
+ "PerNode"
+ ],
+ "defaultValue": "Free",
+ "metadata": {
+ "description": "Service Tier: Free, Standalone, or PerNode"
+ }
+ },
+ "dataRetention": {
+ "type": "int",
+ "defaultValue": 90,
+ "minValue": 7,
+ "maxValue": 730,
+ "metadata": {
+ "description": "Number of days of retention. Free plans can only have 7 days, Standalone and OMS plans include 30 days for free"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Default location"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "[concat('oms-workspace',uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "sku": {
+ "name": "Free"
+ },
+ "retention": 90
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationsManagement/solutions",
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "apiVersion": "2015-11-01-preview",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "plan": {
+ "name": "[concat(parameters('omsSolutionsName')[copyIndex()], '(', parameters('omsWorkspaceName'), ')')]",
+ "product": "[concat('OMSGallery/', parameters('omsSolutionsName')[copyIndex()])]",
+ "promotionCode": "",
+ "publisher": "Microsoft"
+ },
+ "properties": {
+ "workspaceResourceId": "Microsoft.OperationalInsights/workspaces/[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ }
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces/datasources",
+ "kind": "AzureActivityLog",
+ "name": "[concat(parameters('omsWorkspaceName'), '/', subscription().subscriptionId)]",
+ "apiVersion": "2020-08-01",
+ "location": "location",
+ "dependsOn": [
+ "[concat('oms-workspace',uniqueString(resourceGroup().id))]"
+ ],
+ "properties": {
+ "linkedResourceId": "[subscriptionResourceId('microsoft.insights/eventTypes','management')]"
+ }
+ }
+ ],
+ "outputs": {
+ "workspaceName": {
+ "type": "string",
+ "value": "[parameters('omsWorkspaceName')]"
+ },
+ "workspaceId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.OperationalInsights/workspaces/', parameters('omsWorkspaceName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT889 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT889
new file mode 100644
index 0000000..76b7c50
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT889
@@ -0,0 +1,220 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.network/applicationgateway.json"
+ ],
+ "timestamp": 1642962902539,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.network/applicationgateway.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT889",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/applicationgateways"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT889",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "applicationGatewaySize": {
+ "type": "string",
+ "allowedValues": [
+ "WAF_Medium",
+ "WAF_Large"
+ ],
+ "defaultValue": "WAF_Medium",
+ "metadata": {
+ "description": "application gateway size"
+ }
+ },
+ "capacity": {
+ "type": "int",
+ "minValue": 2,
+ "maxValue": 10,
+ "defaultValue": 2,
+ "metadata": {
+ "description": "Number of instances"
+ }
+ },
+ "wafEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "WAF Enabled"
+ }
+ },
+ "wafMode": {
+ "type": "string",
+ "allowedValues": [
+ "Detection",
+ "Prevention"
+ ],
+ "defaultValue": "Detection",
+ "metadata": {
+ "description": "WAF Mode"
+ }
+ },
+ "wafRuleSetType": {
+ "type": "string",
+ "allowedValues": [
+ "OWASP"
+ ],
+ "defaultValue": "OWASP",
+ "metadata": {
+ "description": "WAF Rule Set Type"
+ }
+ },
+ "wafRuleSetVersion": {
+ "type": "string",
+ "allowedValues": [
+ "2.2.9",
+ "3.0"
+ ],
+ "defaultValue": "3.0",
+ "metadata": {
+ "description": "WAF Rule Set Version"
+ }
+ },
+ "applicationGatewayName": {
+ "type": "string"
+ },
+ "publicIPRef": {
+ "type": "string"
+ },
+ "frontendPorts": {
+ "type": "array"
+ },
+ "gatewayIPConfigurations": {
+ "type": "array"
+ },
+ "backendAddressPools": {
+ "type": "array"
+ },
+ "backendHttpSettingsCollection": {
+ "type": "array"
+ },
+ "httpListeners": {
+ "type": "array"
+ },
+ "requestRoutingRules": {
+ "type": "array"
+ },
+ "probes": {
+ "type": "array"
+ },
+ "omsWorkspaceResourceId": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "name": "applicationGatewayName",
+ "type": "Microsoft.Network/applicationGateways",
+ "location": "location",
+ "properties": {
+ "sku": {
+ "name": "WAF_Medium",
+ "tier": "WAF",
+ "capacity": 2
+ },
+ "gatewayIPConfigurations": "gatewayIPConfigurations",
+ "frontendIPConfigurations": [
+ {
+ "name": "appGatewayFrontendIP",
+ "properties": {
+ "PublicIPAddress": {
+ "id": "publicIPRef"
+ }
+ }
+ }
+ ],
+ "frontendPorts": "frontendPorts",
+ "backendAddressPools": "backendAddressPools",
+ "backendHttpSettingsCollection": "backendHttpSettingsCollection",
+ "httpListeners": "httpListeners",
+ "requestRoutingRules": "requestRoutingRules",
+ "webApplicationFirewallConfiguration": {
+ "enabled": true,
+ "firewallMode": "Detection",
+ "ruleSetType": "OWASP",
+ "ruleSetVersion": "3.0"
+ },
+ "probes": "probes",
+ "sslPolicy": {
+ "disabledSslProtocols": [
+ "TLSv1_0",
+ "TLSv1_1"
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "providers/diagnosticSettings",
+ "name": "Microsoft.Insights/service",
+ "apiVersion": "2017-05-01-preview",
+ "dependsOn": [
+ "applicationGatewayName"
+ ],
+ "properties": {
+ "workspaceId": "omsWorkspaceResourceId",
+ "logs": [
+ {
+ "category": "ApplicationGatewayAccessLog",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": true
+ }
+ },
+ {
+ "category": "ApplicationGatewayPerformanceLog",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": false
+ }
+ },
+ {
+ "category": "ApplicationGatewayFirewallLog",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": false
+ }
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": false,
+ "days": 0
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT89 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT89
new file mode 100644
index 0000000..ed2b0b1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT89
@@ -0,0 +1,536 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/data-node-ds13.json"
+ ],
+ "timestamp": 1642962885892,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/data-node-ds13.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT89",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT89",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "dnsNamePrefix-dn",
+ "nicName": "dnsNamePrefix-dn-nic",
+ "storageAccountName": "dnstorageAccount",
+ "publicIPAddressName": "dnsNamePrefix-dn-publicIP",
+ "securityGroupName": "dnsNamePrefix-dn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "dnsNamePrefix-dn-sg",
+ "location": "[resourceGroup().location]",
+ "comments": "Shared Resources Network Security Group Rules",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.Web.UI",
+ "properties": {
+ "description": "Allows HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50070",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hiveserver2",
+ "properties": {
+ "description": "Allows Hiveserver traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 102,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hive.Metastore",
+ "properties": {
+ "description": "Allows Hive Metastore traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "9083",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 103,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hue",
+ "properties": {
+ "description": "Allows Hue traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 104,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.ResourceManager",
+ "properties": {
+ "description": "Allows YARN Resource Manager traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8088",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 105,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.JobHistory.Server",
+ "properties": {
+ "description": "Allows YARN JobHistory Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "19888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 106,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Oozie.Server",
+ "properties": {
+ "description": "Allows Oozie Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "11000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 107,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management.Web.UI",
+ "properties": {
+ "description": "Allows Management.Web.UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7180",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 108,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Navigator",
+ "properties": {
+ "description": "Allows Navigator traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7187",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 109,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.dn.Web.UI",
+ "properties": {
+ "description": "Allow HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50075",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.nm.Web.UI",
+ "properties": {
+ "description": "Allow YARN Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8042",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 111,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.JDBC",
+ "properties": {
+ "description": "Allow Impala JDBC traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 112,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.Shell",
+ "properties": {
+ "description": "Allow Impala Shell traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 113,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "RDP",
+ "properties": {
+ "description": "Allow RDP Traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 114,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "copyIndex()dnstorageAccount",
+ "location": "[resourceGroup().location]",
+ "comments": "Data Node storage account configurations",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "storageAccountLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "accountType": "storageAccount"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "dnsNamePrefix-dn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "comments": "Data Node Public IP Address configuration",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNamePrefix-dncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "dnsNamePrefix-dn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "comments": "Data Node network interface configuration",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/dnsNamePrefix-dn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/dnsNamePrefix-dn-sg"
+ ],
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dnsNamePrefix-dn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/dnsNamePrefix-dn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "dnsNamePrefix-dncopyIndex()",
+ "plan": {
+ "name": "cloudera-centos-6",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-6"
+ },
+ "location": "[resourceGroup().location]",
+ "comments": "Data Node virtual machines configurations",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/dnsNamePrefix-dn-niccopyIndex()",
+ "Microsoft.Storage/storageAccounts/copyIndex()dnstorageAccount"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": "false"
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-6",
+ "sku": "CLOUDERA-CENTOS-6",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "dnsNamePrefix-dncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk0",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk1",
+ "diskSizeGB": 1023,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk2",
+ "diskSizeGB": 1023,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk3",
+ "diskSizeGB": 1023,
+ "lun": 3,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk4",
+ "diskSizeGB": 1023,
+ "lun": 4,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk5",
+ "diskSizeGB": 1023,
+ "lun": 5,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dnsNamePrefix-dn-niccopyIndex()"
+ }
+ ],
+ "inputEndpoints": [
+ {
+ "enableDirectServerReturn": "False",
+ "endpointName": "HDFS.dn.Web.UI",
+ "privatePort": 50075,
+ "publicPort": 50075,
+ "protocol": "Tcp"
+ },
+ {
+ "enableDirectServerReturn": "False",
+ "endpointName": "YARN.nm.Web.UI",
+ "privatePort": 8042,
+ "publicPort": 8042,
+ "protocol": "Tcp"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "dnsNamePrefix-dncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "comments": "Data Node VM Extensions and scripts to configure the Cloudera cluster",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/dnsNamePrefix-dncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-datanode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh \"', variables('masterIP'), '\" \"', variables('workerIP'), '\" \"', parameters('dnsNamePrefix'), '\" \"', reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, '\" ', parameters('clusterSpec').masterNodeCount, ' ', parameters('clusterSpec').dataNodeCount, ' \"', parameters('vmSpec').adminUsername, '\" ', 'datanode', ' >> /home/$ADMINUSER/initialize-datanode.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT890 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT890
new file mode 100644
index 0000000..a93e09c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT890
@@ -0,0 +1,76 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.network/publicipaddress.json"
+ ],
+ "timestamp": 1642962902549,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.network/publicipaddress.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT890",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT890",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publicIPAddressName": {
+ "type": "string"
+ },
+ "publicIPAddressType": {
+ "type": "string",
+ "defaultValue": "Dynamic"
+ },
+ "dnsNameForPublicIP": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIPAddressName",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNameForPublicIP"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "publicIPAddressName": {
+ "type": "string",
+ "value": "[parameters('publicIPAddressName')]"
+ },
+ "publicIPRef": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/publicIPAddresses',parameters('publicIPAddressName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT891 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT891
new file mode 100644
index 0000000..884da5e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT891
@@ -0,0 +1,73 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.network/virtualnetworks.json"
+ ],
+ "timestamp": 1642962902557,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.network/virtualnetworks.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT891",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT891",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vnetName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "addressPrefix": {
+ "type": "string"
+ },
+ "subnets": {
+ "type": "array"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "name": "vnetName",
+ "apiVersion": "2020-08-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "addressPrefix"
+ ]
+ },
+ "subnets": "subnets"
+ }
+ }
+ ],
+ "outputs": {
+ "vnetId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Network/virtualNetworks',parameters('vnetName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT892 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT892
new file mode 100644
index 0000000..d92f549
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT892
@@ -0,0 +1,56 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.auditingsettings.json"
+ ],
+ "timestamp": 1642962902566,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.auditingsettings.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT892",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers/auditingsettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT892",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "storageAccountName": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-02-02-preview",
+ "type": "Microsoft.Sql/servers/auditingSettings",
+ "name": "sqlServerName/default",
+ "properties": {
+ "state": "Enabled",
+ "storageEndpoint": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').PrimaryEndpoints.Blob]",
+ "storageAccountAccessKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').keys[0].value]",
+ "retentionDays": 0,
+ "storageAccountSubscriptionId": "[subscription().subscriptionId]",
+ "isStorageSecondaryKeyInUse": false
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT893 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT893
new file mode 100644
index 0000000..6b1ec58
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT893
@@ -0,0 +1,205 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.databases.json"
+ ],
+ "timestamp": 1642962902572,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.databases.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT893",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers/databases"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT893",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "databaseName": {
+ "type": "string",
+ "defaultValue": "contosodb"
+ },
+ "location": {
+ "type": "string"
+ },
+ "edition": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "allowedValues": [
+ "Web",
+ "Business",
+ "Basic",
+ "Standard",
+ "Premium",
+ "Free",
+ "Stretch",
+ "DataWarehouse",
+ "System",
+ "System2"
+ ]
+ },
+ "tags": {
+ "type": "object"
+ },
+ "omsWorkspaceResourceId": {
+ "type": "string"
+ },
+ "administratorLogin": {
+ "type": "string"
+ },
+ "administratorLoginPassword": {
+ "type": "securestring"
+ },
+ "bacpacuri": {
+ "type": "string"
+ },
+ "logsRetentionInDays": {
+ "type": "int",
+ "defaultValue": 0,
+ "minValue": 0,
+ "maxValue": 365,
+ "metadata": {
+ "description": "Specifies the number of days that logs are gonna be kept. If you do not want to apply any retention policy and retain data forever, set value to 0."
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "sqlServerName/contosodb",
+ "type": "Microsoft.Sql/servers/databases",
+ "apiVersion": "2020-02-02-preview",
+ "tags": "tags",
+ "location": "location",
+ "properties": {
+ "createMode": "Default",
+ "edition": "Basic"
+ },
+ "resources": [
+ {
+ "name": "Import",
+ "type": "extensions",
+ "apiVersion": "2014-04-01-preview",
+ "dependsOn": [
+ "Microsoft.Sql/servers/databases/sqlServerName/contosodb"
+ ],
+ "properties": {
+ "storageKey": "?",
+ "storageKeyType": "SharedAccessKey",
+ "storageUri": "bacpacuri",
+ "administratorLogin": "administratorLogin",
+ "administratorLoginPassword": "administratorLoginPassword",
+ "operationMode": "Import"
+ }
+ },
+ {
+ "type": "providers/diagnosticSettings",
+ "name": "Microsoft.Insights/service",
+ "dependsOn": [
+ "Microsoft.Sql/servers/databases/sqlServerName/contosodb"
+ ],
+ "apiVersion": "2017-05-01-preview",
+ "properties": {
+ "workspaceId": "omsWorkspaceResourceId",
+ "logs": [
+ {
+ "category": "QueryStoreRuntimeStatistics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "QueryStoreWaitStatistics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "Errors",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "DatabaseWaitStatistics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "Timeouts",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "Blocks",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ },
+ {
+ "category": "SQLInsights",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 0,
+ "enabled": true
+ }
+ }
+ ],
+ "metrics": [
+ {
+ "timeGrain": "AllMetrics",
+ "enabled": true,
+ "retentionPolicy": {
+ "enabled": true,
+ "days": 0
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "databaseName": {
+ "type": "string",
+ "value": "[parameters('databaseName')]"
+ },
+ "dbConnetcionString": {
+ "type": "string",
+ "value": "[concat('Data Source=tcp:', reference(resourceId('Microsoft.Sql/servers/', parameters('sqlServerName')),'2020-02-02-preview').fullyQualifiedDomainName,',1433;Initial Catalog=', parameters('databaseName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT894 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT894
new file mode 100644
index 0000000..5cb32ea
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT894
@@ -0,0 +1,64 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.securityalertpolicies.json"
+ ],
+ "timestamp": 1642962902579,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.securityalertpolicies.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT894",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers/securityalertpolicies"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT894",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "storageAccountName": {
+ "type": "string"
+ },
+ "sendAlertsTo": {
+ "type": "string",
+ "defaultValue": "dummy@contoso.com",
+ "metadata": {
+ "description": "Specifies the semicolon-separated list of e-mail addresses to which the alert is sent."
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-02-02-preview",
+ "type": "Microsoft.Sql/servers/securityAlertPolicies",
+ "name": "sqlServerName/default",
+ "properties": {
+ "state": "Enabled",
+ "emailAddresses": [
+ "dummy@contoso.com"
+ ],
+ "storageEndpoint": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').PrimaryEndpoints.Blob]",
+ "storageAccountAccessKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-01-01').keys[0].value]",
+ "retentionDays": 0
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT895 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT895
new file mode 100644
index 0000000..95334a3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT895
@@ -0,0 +1,89 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.v12.0.json"
+ ],
+ "timestamp": 1642962902584,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.sql/servers.v12.0.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT895",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.sql/servers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT895",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "sqlServerName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "administratorLogin": {
+ "type": "string"
+ },
+ "administratorLoginPassword": {
+ "type": "securestring"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "name": "sqlServerName",
+ "type": "Microsoft.Sql/servers",
+ "apiVersion": "2020-02-02-preview",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "administratorLogin": "administratorLogin",
+ "administratorLoginPassword": "administratorLoginPassword",
+ "version": "12.0"
+ },
+ "resources": [
+ {
+ "name": "AllowAllWindowsAzureIps",
+ "type": "firewallRules",
+ "location": "location",
+ "apiVersion": "2015-05-01-preview",
+ "dependsOn": [
+ "Microsoft.Sql/servers/sqlServerName"
+ ],
+ "properties": {
+ "startIpAddress": "0.0.0.0",
+ "endIpAddress": "0.0.0.0"
+ }
+ }
+ ]
+ }
+ ],
+ "outputs": {
+ "name": {
+ "type": "string",
+ "value": "[parameters('sqlServerName')]"
+ },
+ "fqdn": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Sql/servers/', parameters('sqlServerName')),'2020-02-02-preview').fullyQualifiedDomainName]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT896 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT896
new file mode 100644
index 0000000..cf32da1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT896
@@ -0,0 +1,91 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.storage/storageaccounts.json"
+ ],
+ "timestamp": 1642962902590,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.storage/storageaccounts.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT896",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT896",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountName": {
+ "type": "string"
+ },
+ "sku": {
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_GRS",
+ "Standard_RAGRS",
+ "Standard_ZRS",
+ "Premium_LRS"
+ ],
+ "defaultValue": "Standard_LRS",
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "name": "storageAccountName",
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2021-01-01",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "location": "location",
+ "tags": "tags",
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "properties": {
+ "encryption": {
+ "services": {
+ "blob": {
+ "enabled": true
+ },
+ "file": {
+ "enabled": true
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ },
+ "supportsHttpsTrafficOnly": true
+ }
+ }
+ ],
+ "outputs": {
+ "storageAccountName": {
+ "type": "string",
+ "value": "[parameters('storageAccountName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT897 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT897
new file mode 100644
index 0000000..d14795d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT897
@@ -0,0 +1,89 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/serverfarms.json"
+ ],
+ "timestamp": 1642962902596,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/serverfarms.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT897",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT897",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "name": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Free"
+ },
+ "skucode": {
+ "type": "string",
+ "defaultValue": "F1"
+ },
+ "workerSize": {
+ "type": "int",
+ "defaultValue": 0
+ },
+ "workerSizeId": {
+ "type": "int",
+ "defaultValue": 0
+ },
+ "numberOfWorkers": {
+ "type": "int",
+ "defaultValue": 1
+ },
+ "hostingEnvironment": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "name": "name",
+ "type": "Microsoft.Web/serverfarms",
+ "location": "location",
+ "tags": "tags",
+ "properties": {
+ "name": "name",
+ "workerSize": 0,
+ "workerSizeId": 0,
+ "numberOfWorkers": 1,
+ "reserved": false,
+ "hostingEnvironment": ""
+ },
+ "sku": {
+ "Tier": "Free",
+ "Name": "skuCode"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT898 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT898
new file mode 100644
index 0000000..2c2b2e4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT898
@@ -0,0 +1,75 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/sites.config.connectionstrings.json"
+ ],
+ "timestamp": 1642962902602,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/sites.config.connectionstrings.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT898",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites/config"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT898",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "webAppName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "connectionType": {
+ "type": "string",
+ "defaultValue": "Custom",
+ "allowedValues": [
+ "MySql",
+ "SQLServer",
+ "SQLAzure",
+ "Custom",
+ "NotificationHub",
+ "ServiceBus",
+ "EventHub",
+ "ApiHub",
+ "DocDb",
+ "RedisCache",
+ "PostgreSQL"
+ ]
+ },
+ "connectionString": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "name": "webAppName/connectionstrings",
+ "apiVersion": "2018-02-01",
+ "type": "Microsoft.Web/sites/config",
+ "location": "location",
+ "properties": {
+ "DefaultConnection": {
+ "value": "connectionString",
+ "type": "Custom"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT899 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT899
new file mode 100644
index 0000000..046c4ad
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT899
@@ -0,0 +1,59 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/sites.extensions.msdeploy.json"
+ ],
+ "timestamp": 1642962902607,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/sites.extensions.msdeploy.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT899",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT899",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "webAppName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "packageUri": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "resources": [
+ {
+ "name": "webAppName/MSDeploy",
+ "type": "Microsoft.Web/sites/extensions",
+ "location": "location",
+ "apiVersion": "2018-02-01",
+ "tags": "tags",
+ "properties": {
+ "packageUri": "packageUri"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT9 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT9
new file mode 100644
index 0000000..64c478f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT9
@@ -0,0 +1,668 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/azuredeploy.json",
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962883362,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/azuredeploy.json",
+ "/application-workloads/active-directory/active-directory-new-domain-ha-2-dc/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT9",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.resources/deployments",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT9",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Administrator of the new VM and Domain"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the Administrator account of the new VM and Domain"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "domainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The FQDN of the AD Domain created "
+ },
+ "value": "mydomain.local"
+ },
+ "dnsPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "The DNS prefix for the public IP address used by the Load Balancer"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "pdcRDPPort": {
+ "type": "int",
+ "metadata": {
+ "description": "The public RDP port for the PDC VM"
+ },
+ "defaultValue": 3389
+ },
+ "bdcRDPPort": {
+ "type": "int",
+ "metadata": {
+ "description": "The public RDP port for the BDC VM"
+ },
+ "defaultValue": 13389
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation"
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adVMSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size for the VM. This sample uses premium disk and requires an 'S' sku."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountType": "Premium_LRS",
+ "adPDCVMName": "adPDC",
+ "adBDCVMName": "adBDC",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "imageSKU": "2016-Datacenter",
+ "adAvailabilitySetName": "adAvailabiltySet",
+ "publicIPAddressName": "ad-lb-pip",
+ "adLBFE": "LBFE",
+ "adLBBE": "LBBE",
+ "adPDCRDPNAT": "adPDCRDP",
+ "adBDCRDPNAT": "adBDCRDP",
+ "virtualNetworkName": "adVNET",
+ "virtualNetworkAddressRange": "10.0.0.0/16",
+ "adSubnetName": "adSubnet",
+ "adSubnet": "10.0.0.0/24",
+ "adPDCNicName": "adPDCNic",
+ "adPDCNicIPAddress": "10.0.0.4",
+ "adBDCNicName": "adBDCNic",
+ "adBDCNicIPAddress": "10.0.0.5",
+ "adSubnetRef": "Microsoft.Network/virtualNetworks/subnets/adVNET/adSubnet",
+ "adLBName": "adLoadBalancer",
+ "adlbFEConfigID": "Microsoft.Network/loadBalancers/frontendIPConfigurations/adLoadBalancer/LBFE",
+ "adPDCRDPNATRuleID": "Microsoft.Network/loadBalancers/inboundNatRules/adLoadBalancer/adPDCRDP",
+ "adBDCRDPNATRuleID": "Microsoft.Network/loadBalancers/inboundNatRules/adLoadBalancer/adBDCRDP",
+ "adBEAddressPoolID": "Microsoft.Network/loadBalancers/backendAddressPools/adLoadBalancer/LBBE",
+ "adDataDiskSize": 1000,
+ "vnetTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet.json', parameters('_artifactsLocationSasToken')))]",
+ "nicTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/nic.json', parameters('_artifactsLocationSasToken')))]",
+ "vnetwithDNSTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet-with-dns-server.json', parameters('_artifactsLocationSasToken')))]",
+ "configureADBDCTemplateUri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/configureADBDC.json', parameters('_artifactsLocationSasToken')))]",
+ "adPDCModulesURL": "[uri(parameters('_artifactsLocation'), concat('DSC/CreateADPDC.zip', parameters('_artifactsLocationSasToken')))]",
+ "adPDCConfigurationFunction": "CreateADPDC.ps1\\CreateADPDC",
+ "adBDCPreparationModulesURL": "[uri(parameters('_artifactsLocation'), concat('DSC/PrepareADBDC.zip', parameters('_artifactsLocationSasToken')))]",
+ "adBDCPreparationFunction": "PrepareADBDC.ps1\\PrepareADBDC",
+ "adBDCConfigurationModulesURL": "[uri(parameters('_artifactsLocation'), concat('DSC/ConfigureADBDC.zip', parameters('_artifactsLocationSasToken')))]",
+ "adBDCConfigurationFunction": "ConfigureADBDC.ps1\\ConfigureADBDC"
+ },
+ "resources": [
+ {
+ "name": "ad-lb-pip",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-03-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "location": "[resourceGroup().location]",
+ "name": "adAvailabiltySet",
+ "properties": {
+ "PlatformUpdateDomainCount": 20,
+ "PlatformFaultDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "name": "VNet",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-09-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "virtualNetworkName": {
+ "value": "adVNET"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "value": "adSubnet"
+ },
+ "subnetRange": {
+ "value": "10.0.0.0/24"
+ }
+ }
+ }
+ },
+ {
+ "name": "adLoadBalancer",
+ "type": "Microsoft.Network/loadBalancers",
+ "apiVersion": "2020-03-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/ad-lb-pip"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LBFE",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/ad-lb-pip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LBBE"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "adPDCRDP",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/adLoadBalancer/LBFE"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 3389,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "adBDCRDP",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/adLoadBalancer/LBFE"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 13389,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "adPDCNic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-03-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/VNet",
+ "Microsoft.Network/loadbalancers/adLoadBalancer"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.0.4",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/adVNET/adSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/adLoadBalancer/LBBE"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/adLoadBalancer/adPDCRDP"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "adBDCNic",
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-03-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/VNet",
+ "Microsoft.Network/loadBalancers/adLoadBalancer"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.0.5",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/adVNET/adSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/adLoadBalancer/LBBE"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/adLoadBalancer/adBDCRDP"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "adPDC",
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/adPDCNic",
+ "Microsoft.Compute/availabilitySets/adAvailabiltySet",
+ "Microsoft.Network/loadBalancers/adLoadBalancer"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/adAvailabiltySet"
+ },
+ "osProfile": {
+ "computerName": "adPDC",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "adPDC_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ },
+ "dataDisks": [
+ {
+ "name": "adPDC_data-disk1",
+ "caching": "None",
+ "diskSizeGB": 1000,
+ "lun": 0,
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/adPDCNic"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "CreateADForest",
+ "type": "extensions",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/adPDC"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), concat('DSC/CreateADPDC.zip', parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "CreateADPDC.ps1\\CreateADPDC",
+ "Properties": {
+ "DomainName": "mydomain.local",
+ "AdminCreds": {
+ "UserName": "GEN-UNIQUE",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "GEN-PASSWORD"
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "UpdateVNetDNS1",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-09-01",
+ "dependsOn": [
+ "CreateADForest"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet-with-dns-server.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "virtualNetworkName": {
+ "value": "adVNET"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "value": "adSubnet"
+ },
+ "subnetRange": {
+ "value": "10.0.0.0/24"
+ },
+ "DNSServerAddress": {
+ "value": [
+ "10.0.0.4"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "name": "UpdateBDCNIC",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-09-01",
+ "dependsOn": [
+ "adBDCNic",
+ "UpdateVNetDNS1"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/nic.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "nicName": {
+ "value": "adBDCNic"
+ },
+ "ipConfigurations": {
+ "value": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.0.5",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/adVNET/adSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/adLoadBalancer/LBBE"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/adLoadBalancer/adBDCRDP"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "dnsServers": {
+ "value": [
+ "10.0.0.4"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "name": "adBDC",
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/adBDCNic",
+ "Microsoft.Compute/availabilitySets/adAvailabiltySet",
+ "Microsoft.Network/loadBalancers/adLoadBalancer"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/adAvailabiltySet"
+ },
+ "osProfile": {
+ "computerName": "adBDC",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "adBDC_osdisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ },
+ "dataDisks": [
+ {
+ "name": "adBDC_data-disk1",
+ "caching": "None",
+ "diskSizeGB": 1000,
+ "lun": 0,
+ "createOption": "Empty",
+ "managedDisk": {
+ "storageAccountType": "Premium_LRS"
+ }
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/adBDCNic"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "adBDC/PrepareBDC",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/adBDC"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), concat('DSC/PrepareADBDC.zip', parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "PrepareADBDC.ps1\\PrepareADBDC",
+ "Properties": {
+ "DNSServer": "10.0.0.4"
+ }
+ }
+ }
+ },
+ {
+ "name": "ConfiguringBackupADDomainController",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-09-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/extensions/adBDC/PrepareBDC",
+ "Microsoft.Resources/deployments/UpdateBDCNIC"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/configureADBDC.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "adBDCVMName": {
+ "value": "adBDC"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "domainName": {
+ "value": "mydomain.local"
+ },
+ "adBDCConfigurationFunction": {
+ "value": "ConfigureADBDC.ps1\\ConfigureADBDC"
+ },
+ "adBDCConfigurationModulesURL": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('DSC/ConfigureADBDC.zip', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ }
+ },
+ {
+ "name": "UpdateVNetDNS2",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-09-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/ConfiguringBackupADDomainController"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet-with-dns-server.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "virtualNetworkName": {
+ "value": "adVNET"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "value": "adSubnet"
+ },
+ "subnetRange": {
+ "value": "10.0.0.0/24"
+ },
+ "DNSServerAddress": {
+ "value": [
+ "10.0.0.4",
+ "10.0.0.5"
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT90 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT90
new file mode 100644
index 0000000..6256ee0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT90
@@ -0,0 +1,566 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/data-node-ds14.json"
+ ],
+ "timestamp": 1642962885938,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/data-node-ds14.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT90",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT90",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "dnsNamePrefix-dn",
+ "nicName": "dnsNamePrefix-dn-nic",
+ "storageAccountName": "dnstorageAccount",
+ "publicIPAddressName": "dnsNamePrefix-dn-publicIP",
+ "securityGroupName": "dnsNamePrefix-dn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "dnsNamePrefix-dn-sg",
+ "location": "[resourceGroup().location]",
+ "comments": "Shared Resources Network Security Group Rules",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.Web.UI",
+ "properties": {
+ "description": "Allows HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50070",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hiveserver2",
+ "properties": {
+ "description": "Allows Hiveserver traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 102,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hive.Metastore",
+ "properties": {
+ "description": "Allows Hive Metastore traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "9083",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 103,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hue",
+ "properties": {
+ "description": "Allows Hue traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 104,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.ResourceManager",
+ "properties": {
+ "description": "Allows YARN Resource Manager traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8088",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 105,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.JobHistory.Server",
+ "properties": {
+ "description": "Allows YARN JobHistory Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "19888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 106,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Oozie.Server",
+ "properties": {
+ "description": "Allows Oozie Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "11000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 107,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management.Web.UI",
+ "properties": {
+ "description": "Allows Management.Web.UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7180",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 108,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Navigator",
+ "properties": {
+ "description": "Allows Navigator traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7187",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 109,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.dn.Web.UI",
+ "properties": {
+ "description": "Allow HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50075",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.nm.Web.UI",
+ "properties": {
+ "description": "Allow YARN Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8042",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 111,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.JDBC",
+ "properties": {
+ "description": "Allow Impala JDBC traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 112,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.Shell",
+ "properties": {
+ "description": "Allow Impala Shell traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 113,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "RDP",
+ "properties": {
+ "description": "Allow RDP Traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 114,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "copyIndex()dnstorageAccount",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node storage account configurations",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "storageAccountLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "accountType": "storageAccount"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "dnsNamePrefix-dn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node Public IP Address configuration",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNamePrefix-dncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "dnsNamePrefix-dn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node network interface configuration",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/dnsNamePrefix-dn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/dnsNamePrefix-dn-sg"
+ ],
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').datanodeIpOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dnsNamePrefix-dn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/dnsNamePrefix-dn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "dnsNamePrefix-dncopyIndex()",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "plan": {
+ "name": "cloudera-centos-6",
+ "publisher": "cloudera",
+ "product": "cloudera-centos-6"
+ },
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node virtual machines configurations",
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/dnsNamePrefix-dn-niccopyIndex()",
+ "Microsoft.Storage/storageAccounts/copyIndex()dnstorageAccount"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": "false"
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "cloudera",
+ "offer": "cloudera-centos-6",
+ "sku": "CLOUDERA-CENTOS-6",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "dnsNamePrefix-dncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk0",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk1",
+ "diskSizeGB": 1023,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk2",
+ "diskSizeGB": 1023,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk3",
+ "diskSizeGB": 1023,
+ "lun": 3,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk4",
+ "diskSizeGB": 1023,
+ "lun": 4,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk5",
+ "diskSizeGB": 1023,
+ "lun": 5,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk6",
+ "diskSizeGB": 1023,
+ "lun": 6,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk7",
+ "diskSizeGB": 1023,
+ "lun": 7,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk8",
+ "diskSizeGB": 1023,
+ "lun": 8,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk9",
+ "diskSizeGB": 1023,
+ "lun": 9,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-dncopyIndex()_DataDisk10",
+ "diskSizeGB": 1023,
+ "lun": 10,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dnsNamePrefix-dn-niccopyIndex()"
+ }
+ ],
+ "inputEndpoints": [
+ {
+ "enableDirectServerReturn": "False",
+ "endpointName": "HDFS.dn.Web.UI",
+ "privatePort": 50075,
+ "publicPort": 50075,
+ "protocol": "Tcp"
+ },
+ {
+ "enableDirectServerReturn": "False",
+ "endpointName": "YARN.nm.Web.UI",
+ "privatePort": 8042,
+ "publicPort": 8042,
+ "protocol": "Tcp"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "dnsNamePrefix-dncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node VM Extensions and scripts to configure the Cloudera cluster",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "dataNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/dnsNamePrefix-dncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-datanode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh \"', variables('masterIP'), '\" \"', variables('workerIP'), '\" \"', parameters('dnsNamePrefix'), '\" \"', reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, '\" ', parameters('clusterSpec').masterNodeCount, ' ', parameters('clusterSpec').dataNodeCount, ' \"', parameters('vmSpec').adminUsername, '\" ', 'datanode', ' >> /home/$ADMINUSER/initialize-datanode.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT900 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT900
new file mode 100644
index 0000000..85b88f1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT900
@@ -0,0 +1,84 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/sites.json"
+ ],
+ "timestamp": 1642962902613,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/demos/xss-attack-prevention/nested/microsoft.web/sites.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT900",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT900",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "name": {
+ "type": "string"
+ },
+ "hostingPlanName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "hostingEnvironment": {
+ "type": "string",
+ "defaultValue": ""
+ },
+ "tags": {
+ "type": "object"
+ }
+ },
+ "variables": {
+ "tags": {
+ "[concat('hidden-related:', resourceId('Microsoft.Web/serverfarms',parameters('hostingPlanName')))]": "empty"
+ },
+ "combinedTags": "[union(parameters('tags'),variables('tags'))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-08-01",
+ "name": "name",
+ "type": "Microsoft.Web/sites",
+ "tags": "[union(parameters('tags'),variables('tags'))]",
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "properties": {
+ "name": "name",
+ "serverFarmId": "Microsoft.Web/serverfarms/hostingPlanName",
+ "hostingEnvironment": ""
+ },
+ "location": "location"
+ }
+ ],
+ "outputs": {
+ "principalId": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Web/sites', parameters('name')), '2019-08-01', 'Full').identity.principalId]"
+ },
+ "endpoint": {
+ "type": "string",
+ "value": "[concat(parameters('name'),'.azurewebsites.net')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT902 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT902
new file mode 100644
index 0000000..40829df
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT902
@@ -0,0 +1,101 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/active-directory-new-domain/0.9/nestedtemplates/vnet.json"
+ ],
+ "timestamp": 1642962902639,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/active-directory-new-domain/0.9/nestedtemplates/vnet.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT902",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT902",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Virtual Network to Create"
+ }
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "The address range of the new VNET in CIDR format"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the subnet created in the new VNET"
+ }
+ },
+ "subnetRange": {
+ "type": "string",
+ "metadata": {
+ "description": "The address range of the subnet created in the new VNET"
+ }
+ },
+ "DNSServerAddress": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "The DNS address(es) of the DNS Server(s) used by the VNET"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "dhcpOptions": {
+ "dnsServers": []
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "virtualNetworkName",
+ "apiVersion": "2020-06-01",
+ "location": "location",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "virtualNetworkAddressRange"
+ ]
+ },
+ "dhcpOptions": "[if(not(empty(parameters('DNSServerAddress'))), variables('dhcpOptions'), json('null'))]",
+ "subnets": [
+ {
+ "name": "subnetName",
+ "properties": {
+ "addressPrefix": "subnetRange"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT903 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT903
new file mode 100644
index 0000000..2255904
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT903
@@ -0,0 +1,438 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/active-directory-new-domain/0.9/azuredeploy.json",
+ "/modules/active-directory-new-domain/0.9/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902646,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/active-directory-new-domain/0.9/azuredeploy.json",
+ "/modules/active-directory-new-domain/0.9/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT903",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.resources/deployments",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT903",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the administrator account of the new VM and domain"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the administrator account of the new VM and domain"
+ }
+ },
+ "domainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The FQDN of the Active Directory Domain to be created"
+ },
+ "value": "corp.mydomain.com"
+ },
+ "dnsPrefix": {
+ "type": "string",
+ "defaultValue": "[concat('ad-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "The DNS prefix for the public IP address used by the Load Balancer"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size of the VM for the controller"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of resources, such as templates and DSC modules, that the template depends on"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Auto-generated token to access _artifactsLocation. Leave it blank unless you need to provide your own value."
+ },
+ "defaultValue": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "virtualMachineName": {
+ "type": "string",
+ "defaultValue": "ad-vm",
+ "metadata": {
+ "description": "Virtual machine name."
+ }
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Virtual network address range."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "ad-vnet",
+ "metadata": {
+ "description": "The name of the virtualNetwork."
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "ad-vnet-subnet",
+ "metadata": {
+ "description": "The name of the subnet."
+ }
+ },
+ "privateIPAddress": {
+ "type": "string",
+ "defaultValue": "10.0.0.4",
+ "metadata": {
+ "description": "Private IP address."
+ }
+ },
+ "subnetRange": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet IP range."
+ }
+ }
+ },
+ "variables": {
+ "loadBalancerFrontEndIPName": "ad-LBFE",
+ "backendAddressPoolName": "ad-LBBE",
+ "inboundNatRulesName": "ad-RDP",
+ "networkInterfaceName": "ad-nic",
+ "publicIPAddressName": "ad-ip",
+ "availabilitySetName": "ad-AvailabiltySet",
+ "loadBalancerName": "ad-LoadBalancer"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-06-01",
+ "name": "ad-ip",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2020-06-01",
+ "location": "[resourceGroup().location]",
+ "name": "ad-AvailabiltySet",
+ "properties": {
+ "PlatformUpdateDomainCount": 20,
+ "PlatformFaultDomainCount": 2
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2018-11-01",
+ "name": "VNet",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "virtualNetworkName": {
+ "value": "ad-vnet"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "value": "ad-vnet-subnet"
+ },
+ "subnetRange": {
+ "value": "10.0.0.0/24"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/loadBalancers",
+ "apiVersion": "2020-06-01",
+ "name": "ad-LoadBalancer",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "ad-ip"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "ad-LBFE",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/ad-ip"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "ad-LBBE"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "ad-RDP",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/ad-LoadBalancer/ad-LBFE"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 3389,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "ad-nic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "VNet",
+ "ad-LoadBalancer"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "10.0.0.4",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/ad-vnet/ad-vnet-subnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/ad-LoadBalancer/ad-LBBE"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/ad-LoadBalancer/ad-RDP"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-06-01",
+ "name": "ad-vm",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "ad-nic",
+ "ad-AvailabiltySet",
+ "ad-LoadBalancer"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/ad-AvailabiltySet"
+ },
+ "osProfile": {
+ "computerName": "ad-vm",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "ad-vm_OSDisk",
+ "caching": "ReadOnly",
+ "createOption": "FromImage",
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ }
+ },
+ "dataDisks": [
+ {
+ "name": "ad-vm_DataDisk",
+ "caching": "ReadWrite",
+ "createOption": "Empty",
+ "diskSizeGB": 20,
+ "managedDisk": {
+ "storageAccountType": "StandardSSD_LRS"
+ },
+ "lun": 0
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/ad-nic"
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "extensions",
+ "apiVersion": "2020-06-01",
+ "name": "CreateADForest",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "ad-vm"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.19",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "ModulesUrl": "[uri(parameters('_artifactsLocation'), concat('DSC/CreateADPDC.zip', parameters('_artifactsLocationSasToken')))]",
+ "ConfigurationFunction": "CreateADPDC.ps1\\CreateADPDC",
+ "Properties": {
+ "DomainName": "corp.mydomain.com",
+ "AdminCreds": {
+ "UserName": "GEN-UNIQUE",
+ "Password": "PrivateSettingsRef:AdminPassword"
+ }
+ }
+ },
+ "protectedSettings": {
+ "Items": {
+ "AdminPassword": "adminPassword"
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2018-11-01",
+ "name": "UpdateVNetDNS",
+ "dependsOn": [
+ "CreateADForest"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nestedtemplates/vnet.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "virtualNetworkName": {
+ "value": "ad-vnet"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "value": "ad-vnet-subnet"
+ },
+ "subnetRange": {
+ "value": "10.0.0.0/24"
+ },
+ "DNSServerAddress": {
+ "value": [
+ "10.0.0.4"
+ ]
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "dnsIpAddress": {
+ "type": "string",
+ "value": "[parameters('privateIPAddress')]"
+ },
+ "domainName": {
+ "type": "string",
+ "value": "[parameters('domainName')]"
+ },
+ "virtualNetworkSubscriptionId": {
+ "type": "string",
+ "value": "[subscription().subscriptionId]"
+ },
+ "virtualNetworkResourceGroupName": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "value": "[parameters('virtualNetworkName')]"
+ },
+ "virtualNetworkSubnetName": {
+ "type": "string",
+ "value": "[parameters('subnetName')]"
+ },
+ "virtualNetworkAddressPrefixes": {
+ "type": "string",
+ "value": "[parameters('virtualNetworkAddressRange')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT904 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT904
new file mode 100644
index 0000000..611c1a9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT904
@@ -0,0 +1,168 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/machine-learning-workspace/0.9/azuredeploy.json",
+ "/modules/machine-learning-workspace/0.9/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902654,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/machine-learning-workspace/0.9/azuredeploy.json",
+ "/modules/machine-learning-workspace/0.9/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT904",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts",
+ "microsoft.keyvault/vaults",
+ "microsoft.insights/components",
+ "microsoft.machinelearningservices/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT904",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "defaultValue": "[concat('ml-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the Azure Machine Learning workspace."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location for all resources."
+ }
+ },
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('sa', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "The name for the storage account to created and associated with the workspace."
+ }
+ },
+ "keyVaultName": {
+ "type": "string",
+ "defaultValue": "[concat('kv-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "The name for the key vault to created and associated with the workspace."
+ }
+ },
+ "applicationInsightsName": {
+ "type": "string",
+ "defaultValue": "[concat('ai-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "The name for the application insights to created and associated with the workspace."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2019-06-01",
+ "name": "[concat('sa', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "properties": {
+ "encryption": {
+ "services": {
+ "blob": {
+ "enabled": true
+ },
+ "file": {
+ "enabled": true
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ },
+ "supportsHttpsTrafficOnly": true
+ }
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults",
+ "apiVersion": "2019-09-01",
+ "name": "[concat('kv-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "tenantId": "[subscription().tenantId]",
+ "sku": {
+ "name": "standard",
+ "family": "A"
+ },
+ "enableSoftDelete": false,
+ "accessPolicies": []
+ }
+ },
+ {
+ "type": "Microsoft.Insights/components",
+ "apiVersion": "2020-02-02-preview",
+ "name": "[concat('ai-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "kind": "web",
+ "properties": {
+ "Application_Type": "web"
+ }
+ },
+ {
+ "type": "Microsoft.MachineLearningServices/workspaces",
+ "apiVersion": "2020-08-01",
+ "name": "[concat('ml-', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Insights/components/[concat('ai-', uniqueString(resourceGroup().id))]",
+ "Microsoft.KeyVault/vaults/[concat('kv-', uniqueString(resourceGroup().id))]",
+ "Microsoft.Storage/storageAccounts/[concat('sa', uniqueString(resourceGroup().id))]"
+ ],
+ "identity": {
+ "type": "systemAssigned"
+ },
+ "properties": {
+ "friendlyName": "[concat('ml-', uniqueString(resourceGroup().id))]",
+ "storageAccount": "Microsoft.Storage/storageAccounts/[concat('sa', uniqueString(resourceGroup().id))]",
+ "keyVault": "Microsoft.KeyVault/vaults/[concat('kv-', uniqueString(resourceGroup().id))]",
+ "applicationInsights": "Microsoft.Insights/components/[concat('ai-', uniqueString(resourceGroup().id))]"
+ }
+ }
+ ],
+ "outputs": {
+ "workspaceName": {
+ "type": "string",
+ "value": "[parameters('workspaceName')]"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "value": "[parameters('storageAccountName')]"
+ },
+ "keyVaultName": {
+ "type": "string",
+ "value": "[parameters('keyVaultName')]"
+ },
+ "applicationInsightsName": {
+ "type": "string",
+ "value": "[parameters('applicationInsightsName')]"
+ },
+ "location": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT905 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT905
new file mode 100644
index 0000000..5b5a9b7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT905
@@ -0,0 +1,81 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/Microsoft.Compute/galleries/create/1.0/azuredeploy.json",
+ "/modules/Microsoft.Compute/galleries/create/1.0/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902662,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/Microsoft.Compute/galleries/create/1.0/azuredeploy.json",
+ "/modules/Microsoft.Compute/galleries/create/1.0/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT905",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/galleries"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT905",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "galleryName": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80,
+ "defaultValue": "[concat('shared.gallery.', replace(parameters('location'), ' ', ''))]",
+ "metadata": {
+ "description": "The name of the Shared Image Gallery. The allowed characters are alphabetic, numeric and periods. The maximum length is 80 characters."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of the Shared Image Gallery."
+ }
+ },
+ "description": {
+ "type": "string",
+ "defaultValue": "Sample Description",
+ "metadata": {
+ "description": "The description of this Shared Image Gallery resource. This property is updatable."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/galleries",
+ "name": "[concat('shared.gallery.', replace(parameters('location'), ' ', ''))]",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "description": "Sample Description"
+ }
+ }
+ ],
+ "outputs": {
+ "galleryName": {
+ "type": "string",
+ "value": "[parameters('galleryName')]"
+ },
+ "location": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT906 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT906
new file mode 100644
index 0000000..d4d3c5f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT906
@@ -0,0 +1,246 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/Microsoft.KeyVault/vaults/1.0/azuredeploy.json",
+ "/modules/Microsoft.KeyVault/vaults/1.0/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902668,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/Microsoft.KeyVault/vaults/1.0/azuredeploy.json",
+ "/modules/Microsoft.KeyVault/vaults/1.0/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT906",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.keyvault/vaults"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT906",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vaultName": {
+ "type": "string",
+ "defaultValue": "[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the KeyVault, this value must be globally unique."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the Azure location where the key vault should be created."
+ }
+ },
+ "enabledForDeployment": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether Azure Virtual Machines are permitted to retrieve certificates stored as secrets from the key vault."
+ }
+ },
+ "enabledForDiskEncryption": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether Azure Disk Encryption is permitted to retrieve secrets from the vault and unwrap keys."
+ }
+ },
+ "enabledForTemplateDeployment": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specifies whether Azure Resource Manager is permitted to retrieve secrets from the key vault."
+ }
+ },
+ "enablePurgeProtection": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Property specifying whether protection against purge is enabled for this vault. This property does not accept false but enabled here to allow for this to be optional, if false, the property will not be set."
+ }
+ },
+ "enableRbacAuthorization": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Property that controls how data actions are authorized. When true, the key vault will use Role Based Access Control (RBAC) for authorization of data actions, and the access policies specified in vault properties will be ignored."
+ }
+ },
+ "enableSoftDelete": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Property to specify whether the 'soft delete' functionality is enabled for this key vault. If it's not set to any value(true or false) when creating new key vault, it will be set to true by default. Once set to true, it cannot be reverted to false."
+ }
+ },
+ "softDeleteRetentionInDays": {
+ "type": "int",
+ "defaultValue": 7,
+ "minValue": 7,
+ "maxValue": 90,
+ "metadata": {
+ "description": "softDelete data retention days, only used if enableSoftDelete is true. It accepts >=7 and <=90."
+ }
+ },
+ "tenantId": {
+ "type": "string",
+ "defaultValue": "[subscription().tenantId]",
+ "metadata": {
+ "description": "Specifies the Azure Active Directory tenant ID that should be used for authenticating requests to the key vault. Get it by using Get-AzSubscription cmdlet."
+ }
+ },
+ "networkRuleBypassOptions": {
+ "type": "string",
+ "defaultValue": "AzureServices",
+ "allowedValues": [
+ "None",
+ "AzureServices"
+ ],
+ "metadata": {
+ "description": "Tells what traffic can bypass network rules. This can be 'AzureServices' or 'None'. If not specified the default is 'AzureServices'."
+ }
+ },
+ "NetworkRuleAction": {
+ "type": "string",
+ "defaultValue": "Allow",
+ "allowedValues": [
+ "Allow",
+ "Deny"
+ ],
+ "metadata": {
+ "description": "The default action when no rule from ipRules and from virtualNetworkRules match. This is only used after the bypass property has been evaluated."
+ }
+ },
+ "ipRules": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "An array of IPv4 addresses or rangea in CIDR notation, e.g. '124.56.78.91' (simple IP address) or '124.56.78.0/24' (all addresses that start with 124.56.78)."
+ }
+ },
+ "accessPolicies": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "An complex object array that contains the complete definition of the access policy."
+ },
+ "value": [
+ {
+ "objectId": "GEN-AZUREAD-AKS-OBJID",
+ "tenantId": "GEN-AZUREAD-AKS-TENANTID",
+ "permissions": {}
+ }
+ ]
+ },
+ "virtualNetworkRules": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "An array for resourceIds for the virtualNetworks allowed to access the vault."
+ }
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Specifies whether the key vault is a standard vault or a premium vault."
+ }
+ },
+ "tags": {
+ "type": "object",
+ "defaultValue": {},
+ "metadata": {
+ "description": "Tags to be assigned to the KeyVault."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "name": "[concat('keyvault-', uniqueString(resourceGroup().id))]",
+ "type": "Microsoft.KeyVault/vaults",
+ "apiVersion": "2019-09-01",
+ "location": "[resourceGroup().location]",
+ "tags": {},
+ "properties": {
+ "tenantId": "[subscription().tenantId]",
+ "sku": {
+ "family": "A",
+ "name": "Standard"
+ },
+ "copy": [
+ {
+ "name": "accessPolicies",
+ "count": 28,
+ "input": {
+ "tenantId": "accessPolicies)[copyIndex(accessPolicies",
+ "objectId": "accessPolicies)[copyIndex(accessPolicies",
+ "permissions": "accessPolicies)[copyIndex(accessPolicies"
+ }
+ }
+ ],
+ "enabledForDeployment": false,
+ "enabledForDiskEncryption": false,
+ "enabledForTemplateDeployment": false,
+ "enableSoftDelete": true,
+ "softDeleteRetentionInDays": "[if(parameters('enableSoftDelete'), parameters('softDeleteRetentionInDays'), json('null'))]",
+ "enableRbacAuthorization": false,
+ "enablePurgeProtection": "[if(parameters('enablePurgeProtection'), parameters('enablePurgeProtection'), json('null'))]",
+ "networkAcls": {
+ "bypass": "AzureServices",
+ "defaultAction": "networkRuleAction",
+ "copy": [
+ {
+ "name": "ipRules",
+ "count": 21,
+ "input": {
+ "value": "ipRules)[copyIndex(ipRules"
+ }
+ },
+ {
+ "name": "virtualNetworkRules",
+ "count": 33,
+ "input": {
+ "id": "virtualNetworkRules)[copyIndex(virtualNetworkRules"
+ }
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vaultName": {
+ "type": "string",
+ "value": "[parameters('vaultName')]"
+ },
+ "vaultResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT907 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT907
new file mode 100644
index 0000000..45a7abf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT907
@@ -0,0 +1,90 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/prereqs/prereq.azuredeploy.json",
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902676,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/prereqs/prereq.azuredeploy.json",
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT907",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT907",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "accessPolicies": {
+ "type": "array",
+ "value": [
+ {
+ "objectId": "GEN-AZUREAD-OBJECTID",
+ "tenantId": "GEN-AZUREAD-AKS-TENANTID",
+ "permissions": {
+ "keys": [
+ "create"
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "resources": [
+ {
+ "name": "prereqs",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2019-09-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/modules/Microsoft.KeyVault/vaults/1.0/azuredeploy.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "accessPolicies": {
+ "value": [
+ {
+ "objectId": "GEN-AZUREAD-OBJECTID",
+ "tenantId": "GEN-AZUREAD-AKS-TENANTID",
+ "permissions": {
+ "keys": [
+ "create"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "vaultName": {
+ "type": "string",
+ "value": "[reference('prereqs').outputs.vaultName.value]"
+ },
+ "vaultResourceGroup": {
+ "type": "string",
+ "value": "[reference('prereqs').outputs.vaultResourceGroup.value]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT908 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT908
new file mode 100644
index 0000000..09e6969
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT908
@@ -0,0 +1,127 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/azuredeploy.json",
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902682,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/azuredeploy.json",
+ "/modules/Microsoft.KeyVault/vaults/keys/0.9/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT908",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.keyvault/vaults/keys"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT908",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the KeyVault, this vault must already exist."
+ },
+ "value": "GET-PREREQ-vaultName"
+ },
+ "keyName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the key to be created."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "attributes": {
+ "type": "object",
+ "defaultValue": {},
+ "metadata": {
+ "description": "The attributes of a key managed by the key vault service."
+ }
+ },
+ "crv": {
+ "type": "string",
+ "defaultValue": "",
+ "allowedValues": [
+ "",
+ "P-256",
+ "P-256K",
+ "P-384",
+ "P-521"
+ ],
+ "metadata": {
+ "description": "Elliptic curve name."
+ }
+ },
+ "key_ops": {
+ "type": "array",
+ "defaultValue": [],
+ "metadata": {
+ "description": "JSON web key operations. Operations include: 'encrypt', 'decrypt', 'sign', 'verify', 'wrapKey', 'unwrapKey'"
+ }
+ },
+ "key_size": {
+ "type": "int",
+ "defaultValue": 4096,
+ "metadata": {
+ "description": "The key size in bits. For example: 2048, 3072, or 4096 for RSA."
+ }
+ },
+ "kty": {
+ "type": "string",
+ "defaultValue": "RSA",
+ "allowedValues": [
+ "EC",
+ "EC-HSM",
+ "RSA",
+ "RSA-HSM"
+ ],
+ "metadata": {
+ "description": "The type of key to create"
+ }
+ },
+ "tags": {
+ "type": "object",
+ "defaultValue": {},
+ "metadata": {
+ "description": "Tags to be assigned to the Key."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.KeyVault/vaults/keys",
+ "apiVersion": "2019-09-01",
+ "name": "GET-PREREQ-vaultName/GEN-UNIQUE",
+ "tags": {},
+ "properties": {
+ "attributes": {},
+ "crv": "",
+ "kty": "RSA",
+ "key_ops": [],
+ "key_size": 4096
+ }
+ }
+ ],
+ "outputs": {
+ "key": {
+ "type": "object",
+ "value": "[reference(resourceId('Microsoft.KeyVault/vaults/keys', parameters('vaultName'), parameters('keyName')), '2019-09-01', 'Full')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT909 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT909
new file mode 100644
index 0000000..c75f4d3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT909
@@ -0,0 +1,441 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/Microsoft.ManagedIdentity/user-assigned-identity-role-assignment/1.0/azuredeploy.json",
+ "/modules/Microsoft.ManagedIdentity/user-assigned-identity-role-assignment/1.0/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902688,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/Microsoft.ManagedIdentity/user-assigned-identity-role-assignment/1.0/azuredeploy.json",
+ "/modules/Microsoft.ManagedIdentity/user-assigned-identity-role-assignment/1.0/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT909",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.authorization/roleassignments",
+ "microsoft.managedidentity/userassignedidentities"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT909",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "15576385974467650524"
+ }
+ },
+ "parameters": {
+ "managedIdentityName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the managed identity resource."
+ },
+ "value": "MyManagedIdentity"
+ },
+ "roleDefinitionIds": {
+ "type": "array",
+ "metadata": {
+ "description": "The IDs of the role definitions to assign to the managed identity. Each role assignment is created at the resource group scope. Role definition IDs are GUIDs. To find the GUID for built-in Azure role definitions, see https://docs.microsoft.com/azure/role-based-access-control/built-in-roles. You can also use IDs of custom role definitions."
+ },
+ "value": [
+ "acdd72a7-3385-48ef-bd42-f606fba81ae7"
+ ]
+ },
+ "roleAssignmentDescription": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "An optional description to apply to each role assignment, such as the reason this managed identity needs to be granted the role."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The Azure location where the managed identity should be created."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "copy": [
+ {
+ "name": "roleAssignmentsToCreate",
+ "count": 31,
+ "input": {
+ "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName')), resourceGroup().id, parameters('roleDefinitionIds')[copyIndex('roleAssignmentsToCreate')])]",
+ "roleDefinitionId": "roleDefinitionIds)[copyIndex(roleAssignmentsToCreate"
+ }
+ }
+ ]
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "MyManagedIdentity",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "(roleAssignmentsToCreate)[copyIndex()].name",
+ "properties": {
+ "description": "",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('roleAssignmentsToCreate')[copyIndex()].roleDefinitionId)]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/MyManagedIdentity"
+ ]
+ }
+ ],
+ "outputs": {
+ "managedIdentityResourceId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))]",
+ "metadata": {
+ "description": "The resource ID of the user-assigned managed identity."
+ }
+ },
+ "managedIdentityClientId": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).clientId]",
+ "metadata": {
+ "description": "The ID of the Azure AD application associated with the managed identity."
+ }
+ },
+ "managedIdentityPrincipalId": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]",
+ "metadata": {
+ "description": "The ID of the Azure AD service principal associated with the managed identity."
+ }
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT91 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT91
new file mode 100644
index 0000000..aa3df91
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT91
@@ -0,0 +1,620 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/ds13.json"
+ ],
+ "timestamp": 1642962885954,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/ds13.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT91",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT91",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Admin user name for the VMs"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password for the VMs (A mix of upper and lower-case characters, digits and symbols)"
+ }
+ },
+ "cmUsername": {
+ "type": "string",
+ "defaultValue": "cmadmin",
+ "metadata": {
+ "description": "User name for the Cloudera Manager"
+ }
+ },
+ "cmPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "password for the Cloudera Manager (A mix of upper and lower-case characters, digits and symbols)"
+ }
+ },
+ "storageAccountPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique namespace for the Storage Account where the VM disks will be placed (alphahumeric characters only)"
+ }
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS name where the VMs will be exposed"
+ }
+ },
+ "masterStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for master nodes (defaults to Premium_LRS)"
+ }
+ },
+ "workerStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for worker nodes (defaults to Standard_LRS)"
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "clouderavnet",
+ "metadata": {
+ "description": "The name of the virtual network provisioned for the deployment"
+ }
+ },
+ "vnetNewOrExisting": {
+ "type": "string",
+ "defaultValue": "new",
+ "allowedValues": [
+ "new",
+ "existing"
+ ],
+ "metadata": {
+ "description": "Indicator for new or exiting Virtual Network"
+ }
+ },
+ "virtualNetworkRGName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Resource Group Name for Vnet. For new VNet leave it empty, otherwise type in existing resource group name"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "clouderasubnet",
+ "metadata": {
+ "description": "Subnet name for the virtual network where resources will be provisioned"
+ }
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "Virtual Network address CIDR"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.3.0.0/16",
+ "metadata": {
+ "description": "CIDR for the subnet where VMs will be placed"
+ }
+ },
+ "masterNodeIPAddress": {
+ "type": "string",
+ "defaultValue": "10.3.0.4",
+ "metadata": {
+ "description": "IP address for the first master"
+ }
+ },
+ "dataNodeIPOffSetFromMaster": {
+ "type": "int",
+ "defaultValue": 10,
+ "metadata": {
+ "description": "IP address from the master node, for example if the first master is 10.1.1.1, then the first dataNode would be 10.1.1.11"
+ }
+ },
+ "tshirtSize": {
+ "type": "string",
+ "defaultValue": "Eval",
+ "allowedValues": [
+ "Eval",
+ "Prod"
+ ],
+ "metadata": {
+ "description": "T-shirt size of the Cloudera cluster (Eval, Prod)"
+ }
+ },
+ "numberOfDataNodes": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Number of data nodes for Prod (defaults to 3)"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D8s_v3",
+ "metadata": {
+ "description": "The size of the VMs deployed in the cluster (defaults to Standard_DS13)"
+ }
+ },
+ "company": {
+ "type": "string",
+ "defaultValue": "Company",
+ "metadata": {
+ "description": "Your Company"
+ }
+ },
+ "emailAddress": {
+ "type": "string",
+ "defaultValue": "email@yourcompany.com",
+ "metadata": {
+ "description": "your email"
+ }
+ },
+ "businessPhone": {
+ "type": "string",
+ "defaultValue": "123456789",
+ "metadata": {
+ "description": "your business phone number"
+ }
+ },
+ "firstName": {
+ "type": "string",
+ "defaultValue": "FirstName",
+ "metadata": {
+ "description": "Your FirstName"
+ }
+ },
+ "lastName": {
+ "type": "string",
+ "defaultValue": "LastName",
+ "metadata": {
+ "description": "Your LastName"
+ }
+ },
+ "jobRole": {
+ "type": "string",
+ "defaultValue": "Administrator",
+ "metadata": {
+ "description": "Job Role"
+ },
+ "allowedValues": [
+ "Administrator",
+ "Analyst (Industry/Finance)",
+ "Analyst (Technical)",
+ "Architect",
+ "C level",
+ "Consultant",
+ "Developer",
+ "Director",
+ "Engineer",
+ "Individual contributor",
+ "Manager",
+ "Partner",
+ "Student",
+ "VP"
+ ]
+ },
+ "jobFunction": {
+ "type": "string",
+ "defaultValue": "Analytics / Business Intelligence",
+ "metadata": {
+ "description": "Job Function"
+ },
+ "allowedValues": [
+ "Analytics / Business Intelligence",
+ "Big Data / Architecture",
+ "Data Warehouse / Management",
+ "Data Science",
+ "Database",
+ "ETL / ELT",
+ "Infrastructure",
+ "IT",
+ "Marketing / Sales",
+ "Networking",
+ "Manager",
+ "Security / Compliance",
+ "Storage"
+ ]
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ }
+ },
+ "variables": {
+ "templateAPIVersion": "2015-11-01",
+ "resourceAPIVersion": "2015-06-15",
+ "installCDH": "True",
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "scriptsUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos",
+ "share-resourcesUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/nested/shared-resources-new-vnet.json",
+ "data-nodeUri": "[concat(variables('scriptsUri'), '/nested/data-node-', toLower(subString(parameters('vmSize'), 9, 4)), '.json')]",
+ "sa": "10.3.0.4",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterStorageAccount": {
+ "prefix": "storageAccountPrefix",
+ "type": "Premium_LRS"
+ },
+ "workerStorageAccount": {
+ "prefix": "storageAccountPrefix",
+ "type": "Standard_LRS"
+ },
+ "clusterTshirtSizeEval": {
+ "masterNodeCount": 1,
+ "dataNodeCount": 3,
+ "highAvailability": "false"
+ },
+ "clusterTshirtSizeProd": {
+ "masterNodeCount": 3,
+ "dataNodeCount": 3,
+ "highAvailability": "true"
+ },
+ "clusterSpec": "concat(clusterTshirtSize, parameters(tshirtSize))",
+ "vmSpec": {
+ "vmSize": "Standard_D8s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "adminPassword",
+ "masterNodeASName": "dnsNamePrefix-mnAS",
+ "dataNodeASName": "dnsNamePrefix-dnAS"
+ },
+ "networkSpec": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "clouderavnet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet"
+ },
+ "newVNetId": "Microsoft.Network/virtualNetworks/clouderavnet",
+ "existingVNetId": "parameters('virtualNetworkRGName')/Microsoft.Network/virtualNetworks/clouderavnet",
+ "VNetId": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resources": [
+ {
+ "name": "shared-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Utilizes the shared resources configurations. Uses the DS13 servers sizes for the deployment",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/nested/shared-resources-new-vnet.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "clouderavnet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet"
+ }
+ },
+ "masterNodeASName": {
+ "value": "(vmSpec).masterNodeASName"
+ },
+ "dataNodeASName": {
+ "value": "(vmSpec).dataNodeASName"
+ },
+ "clouderaTags": {
+ "value": "clouderaTags"
+ },
+ "tableauTags": {
+ "value": "tableauTags"
+ },
+ "quickstartTags": {
+ "value": "quickstartTags"
+ }
+ }
+ }
+ },
+ {
+ "name": "master-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Cloudera Master Node resource",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/nested/master-node.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "dnsNamePrefix"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos"
+ },
+ "storageAccount": {
+ "value": {
+ "prefix": "storageAccountPrefix",
+ "type": "Premium_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).masterNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D8s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "adminPassword",
+ "masterNodeASName": "dnsNamePrefix-mnAS",
+ "dataNodeASName": "dnsNamePrefix-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "clouderavnet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "clouderaTags": {
+ "value": "clouderaTags"
+ },
+ "tableauTags": {
+ "value": "tableauTags"
+ },
+ "quickstartTags": {
+ "value": "quickstartTags"
+ }
+ }
+ }
+ },
+ {
+ "name": "data-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Cloudera Data Node resource",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('data-nodeUri')]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "dnsNamePrefix"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos"
+ },
+ "storageAccount": {
+ "value": {
+ "prefix": "storageAccountPrefix",
+ "type": "Standard_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).dataNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D8s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "adminPassword",
+ "masterNodeASName": "dnsNamePrefix-mnAS",
+ "dataNodeASName": "dnsNamePrefix-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "clouderavnet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "clouderaTags": {
+ "value": "clouderaTags"
+ },
+ "tableauTags": {
+ "value": "tableauTags"
+ },
+ "quickstartTags": {
+ "value": "quickstartTags"
+ }
+ }
+ }
+ },
+ {
+ "name": "setup-cloudera",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Resources that setup the Cloudera cluster",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/data-node",
+ "Microsoft.Resources/deployments/master-node"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos/nested/setup-cloudera.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "dnsNamePrefix"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-on-centos"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D8s_v3",
+ "adminUsername": "azureuser",
+ "adminPassword": "adminPassword",
+ "masterNodeASName": "dnsNamePrefix-mnAS",
+ "dataNodeASName": "dnsNamePrefix-dnAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.3.0.0/16",
+ "subnetPrefix": "10.3.0.0/16",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.3.0.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "clouderavnet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "fqdn": {
+ "value": "[reference('master-node').outputs.fqdn.value]"
+ },
+ "cmUsername": {
+ "value": "cmadmin"
+ },
+ "cmPassword": {
+ "value": "cmPassword"
+ },
+ "company": {
+ "value": "Company"
+ },
+ "emailAddress": {
+ "value": "email@yourcompany.com"
+ },
+ "businessPhone": {
+ "value": "123456789"
+ },
+ "firstName": {
+ "value": "FirstName"
+ },
+ "lastName": {
+ "value": "LastName"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Analytics / Business Intelligence"
+ },
+ "installCDH": {
+ "value": "True"
+ },
+ "clouderaTags": {
+ "value": "clouderaTags"
+ },
+ "tableauTags": {
+ "value": "tableauTags"
+ },
+ "quickstartTags": {
+ "value": "quickstartTags"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT910 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT910
new file mode 100644
index 0000000..4b056a8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT910
@@ -0,0 +1,188 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/modules/Microsoft.Storage/storageAccounts/0.9/azuredeploy.json",
+ "/modules/Microsoft.Storage/storageAccounts/0.9/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902695,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/modules/Microsoft.Storage/storageAccounts/0.9/azuredeploy.json",
+ "/modules/Microsoft.Storage/storageAccounts/0.9/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT910",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT910",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the Azure location where the key vault should be created."
+ }
+ },
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('storage', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the storageAccount."
+ }
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Premium_LRS",
+ "Premium_ZRS",
+ "Standard_GRS",
+ "Standard_GZRS",
+ "Standard_LRS",
+ "Standard_RAGRS",
+ "Standard_RAGZRS",
+ "Standard_ZRS"
+ ],
+ "metadata": {
+ "description": "Specifies the sku name for the storage account."
+ }
+ },
+ "kind": {
+ "type": "string",
+ "defaultValue": "StorageV2",
+ "allowedValues": [
+ "BlobStorage",
+ "BlockBlobStorage",
+ "FileStorage",
+ "Storage",
+ "StorageV2"
+ ],
+ "metadata": {
+ "description": "Specifies the type of storage account."
+ }
+ },
+ "accessTier": {
+ "type": "string",
+ "defaultValue": "Hot",
+ "allowedValues": [
+ "Hot",
+ "Cool"
+ ],
+ "metadata": {
+ "description": "Required for storage accounts where kind = BlobStorage. The access tier used for billing."
+ }
+ },
+ "minimumTlsVersion": {
+ "type": "string",
+ "defaultValue": "TLS1_2",
+ "allowedValues": [
+ "TLS1_0",
+ "TLS1_1",
+ "TLS1_2"
+ ],
+ "metadata": {
+ "description": "Set the minimum TLS version to be permitted on requests to storage."
+ }
+ },
+ "supportsHttpsTrafficOnly": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Allows https traffic only to storage service if set to true."
+ }
+ },
+ "allowBlobPublicAccess": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Allow or disallow public access to all blobs or containers in the storage account."
+ }
+ },
+ "allowSharedKeyAccess": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Indicates whether the storage account permits requests to be authorized with the account access key via Shared Key. If false, then all requests, including shared access signatures, must be authorized with Azure Active Directory (Azure AD)."
+ }
+ },
+ "networkAclsBypass": {
+ "type": "string",
+ "defaultValue": "AzureServices",
+ "allowedValues": [
+ "AzureServices",
+ "Logging",
+ "Metrics",
+ "None"
+ ],
+ "metadata": {
+ "description": "Specifies whether traffic is bypassed by the indicated service."
+ }
+ },
+ "networkAclsDefaultAction": {
+ "type": "string",
+ "defaultValue": "Allow",
+ "allowedValues": [
+ "Allow",
+ "Deny"
+ ],
+ "metadata": {
+ "description": "Specifies the default action of allow or deny when no other rules match."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2021-01-01",
+ "name": "[concat('storage', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "properties": {
+ "accessTier": "Hot",
+ "minimumTlsVersion": "TLS1_2",
+ "supportsHttpsTrafficOnly": true,
+ "allowBlobPublicAccess": true,
+ "allowSharedKeyAccess": true,
+ "networkAcls": {
+ "bypass": "AzureServices",
+ "defaultAction": "Allow"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "storageAccountName": {
+ "type": "string",
+ "value": "[parameters('storageAccountName')]"
+ },
+ "storageAccountResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "location": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT911 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT911
new file mode 100644
index 0000000..8c03227
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT911
@@ -0,0 +1,121 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.json",
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902701,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.json",
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT911",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.analysisservices/servers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT911",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "1941147710552294869"
+ }
+ },
+ "parameters": {
+ "serverName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Azure Analysis Services server to create. Server name must begin with a letter, be lowercase alphanumeric, and between 3 and 63 characters in length. Server name must be unique per region."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of the Azure Analysis Services server. For supported regions, see https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-overview#availability-by-region"
+ }
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "S0",
+ "metadata": {
+ "description": "The sku name of the Azure Analysis Services server to create. Choose from: B1, B2, D1, S0, S1, S2, S3, S4, S8, S9. Some skus are region specific. See https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-overview#availability-by-region"
+ }
+ },
+ "capacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The total number of query replica scale-out instances. Scale-out of more than one instance is supported on selected regions only. See https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-overview#availability-by-region"
+ }
+ },
+ "firewallSettings": {
+ "type": "object",
+ "defaultValue": {
+ "firewallRules": [
+ {
+ "firewallRuleName": "AllowFromAll",
+ "rangeStart": "0.0.0.0",
+ "rangeEnd": "255.255.255.255"
+ }
+ ],
+ "enablePowerBIService": true
+ },
+ "metadata": {
+ "description": "The inbound firewall rules to define on the server. If not specified, firewall is disabled."
+ }
+ },
+ "backupBlobContainerUri": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The SAS URI to a private Azure Blob Storage container with read, write and list permissions. Required only if you intend to use the backup/restore functionality. See https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-backup"
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.AnalysisServices/servers",
+ "apiVersion": "2017-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "S0",
+ "capacity": 1
+ },
+ "properties": {
+ "ipV4FirewallSettings": {
+ "firewallRules": [
+ {
+ "firewallRuleName": "AllowFromAll",
+ "rangeStart": "0.0.0.0",
+ "rangeEnd": "255.255.255.255"
+ }
+ ],
+ "enablePowerBIService": true
+ },
+ "backupBlobContainerUri": ""
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT912 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT912
new file mode 100644
index 0000000..28ef397
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT912
@@ -0,0 +1,122 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.json",
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962902708,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.json",
+ "/quickstarts/microsoft.analysisservices/analysis-services-create/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT912",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.analysisservices/servers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT912",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "1941147710552294869"
+ }
+ },
+ "parameters": {
+ "serverName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Azure Analysis Services server to create. Server name must begin with a letter, be lowercase alphanumeric, and between 3 and 63 characters in length. Server name must be unique per region."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of the Azure Analysis Services server. For supported regions, see https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-overview#availability-by-region"
+ },
+ "value": "usgovarizona"
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "S0",
+ "metadata": {
+ "description": "The sku name of the Azure Analysis Services server to create. Choose from: B1, B2, D1, S0, S1, S2, S3, S4, S8, S9. Some skus are region specific. See https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-overview#availability-by-region"
+ }
+ },
+ "capacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The total number of query replica scale-out instances. Scale-out of more than one instance is supported on selected regions only. See https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-overview#availability-by-region"
+ }
+ },
+ "firewallSettings": {
+ "type": "object",
+ "defaultValue": {
+ "firewallRules": [
+ {
+ "firewallRuleName": "AllowFromAll",
+ "rangeStart": "0.0.0.0",
+ "rangeEnd": "255.255.255.255"
+ }
+ ],
+ "enablePowerBIService": true
+ },
+ "metadata": {
+ "description": "The inbound firewall rules to define on the server. If not specified, firewall is disabled."
+ }
+ },
+ "backupBlobContainerUri": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The SAS URI to a private Azure Blob Storage container with read, write and list permissions. Required only if you intend to use the backup/restore functionality. See https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-backup"
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.AnalysisServices/servers",
+ "apiVersion": "2017-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovarizona",
+ "sku": {
+ "name": "S0",
+ "capacity": 1
+ },
+ "properties": {
+ "ipV4FirewallSettings": {
+ "firewallRules": [
+ {
+ "firewallRuleName": "AllowFromAll",
+ "rangeStart": "0.0.0.0",
+ "rangeEnd": "255.255.255.255"
+ }
+ ],
+ "enablePowerBIService": true
+ },
+ "backupBlobContainerUri": ""
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT913 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT913
new file mode 100644
index 0000000..cd94bf1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT913
@@ -0,0 +1,489 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-all-resources/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-all-resources/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902715,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-all-resources/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-all-resources/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT913",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT913",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Standard",
+ "Premium"
+ ],
+ "defaultValue": "Standard",
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "mutualAuthenticationCertificate": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Base-64 encoded Mutual authentication PFX certificate."
+ },
+ "value": ""
+ },
+ "certificatePassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Mutual authentication certificate password."
+ },
+ "value": ""
+ },
+ "eventHubNamespaceConnectionString": {
+ "type": "securestring",
+ "metadata": {
+ "description": "EventHub connection string for logger."
+ },
+ "value": ""
+ },
+ "googleClientSecret": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Google client secret to configure google identity."
+ },
+ "value": ""
+ },
+ "openIdConnectClientSecret": {
+ "type": "securestring",
+ "metadata": {
+ "description": "OpenId connect client secret."
+ },
+ "value": ""
+ },
+ "tenantPolicy": {
+ "type": "string",
+ "metadata": {
+ "description": "Tenant policy XML."
+ },
+ "value": ""
+ },
+ "apiPolicy": {
+ "type": "string",
+ "metadata": {
+ "description": "API policy XML."
+ },
+ "value": ""
+ },
+ "operationPolicy": {
+ "type": "string",
+ "metadata": {
+ "description": "Operation policy XML."
+ },
+ "value": ""
+ },
+ "productPolicy": {
+ "type": "string",
+ "metadata": {
+ "description": "Product policy XML."
+ },
+ "value": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "[resourceGroup().location]",
+ "tags": {},
+ "sku": {
+ "name": "Standard",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "type": "policies",
+ "name": "policy",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "policyContent": ""
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "apis",
+ "name": "PetStoreSwaggerImportExample",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "contentFormat": "SwaggerLinkJson",
+ "contentValue": "http://petstore.swagger.io/v2/swagger.json",
+ "path": "examplepetstore"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "apis",
+ "name": "exampleApi",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "displayName": "Example API Name",
+ "description": "Description for example API",
+ "serviceUrl": "https://example.net",
+ "path": "exampleapipath",
+ "protocols": [
+ "HTTPS"
+ ]
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "type": "operations",
+ "name": "exampleOperationsDELETE",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/apis/exampleApi')]"
+ ],
+ "properties": {
+ "displayName": "DELETE resource",
+ "method": "DELETE",
+ "urlTemplate": "/resource",
+ "description": "A demonstration of a DELETE call"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "operations",
+ "name": "exampleOperationsGET",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/apis/exampleApi')]"
+ ],
+ "properties": {
+ "displayName": "GET resource",
+ "method": "GET",
+ "urlTemplate": "/resource",
+ "description": "A demonstration of a GET call"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "type": "policies",
+ "name": "policy",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/apis/exampleApi')]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/apis/exampleApi/operations/exampleOperationsGET')]"
+ ],
+ "properties": {
+ "policyContent": ""
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "apis",
+ "name": "exampleApiWithPolicy",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "displayName": "Example API Name with Policy",
+ "description": "Description for example API with policy",
+ "serviceUrl": "https://exampleapiwithpolicy.net",
+ "path": "exampleapiwithpolicypath",
+ "protocols": [
+ "HTTPS"
+ ]
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "type": "policies",
+ "name": "policy",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/apis/exampleApiWithPolicy')]"
+ ],
+ "properties": {
+ "policyContent": ""
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "products",
+ "name": "exampleProduct",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "displayName": "Example Product Name",
+ "description": "Description for example product",
+ "terms": "Terms for example product",
+ "subscriptionRequired": true,
+ "approvalRequired": false,
+ "subscriptionsLimit": 1,
+ "state": "published"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "type": "apis",
+ "name": "exampleApi",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/apis/exampleApi')]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/products/exampleProduct')]"
+ ]
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "policies",
+ "name": "policy",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/products/exampleProduct')]"
+ ],
+ "properties": {
+ "policyContent": ""
+ }
+ }
+ ]
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "users",
+ "name": "exampleUser1",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "firstName": "ExampleFirstName1",
+ "lastName": "ExampleLastName1",
+ "email": "ExampleFirst1@example.com",
+ "state": "active",
+ "note": "note for example user 1"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "users",
+ "name": "exampleUser2",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "firstName": "ExampleFirstName2",
+ "lastName": "ExampleLastName2",
+ "email": "ExampleFirst2@example.com",
+ "state": "active",
+ "note": "note for example user 2"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "users",
+ "name": "exampleUser3",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "firstName": "ExampleFirstName3",
+ "lastName": "ExampleLastName3",
+ "email": "ExampleFirst3@example.com",
+ "state": "active",
+ "note": "note for example user 3"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "properties",
+ "name": "exampleproperties",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "displayName": "propertyExampleName",
+ "value": "propertyExampleValue",
+ "tags": [
+ "exampleTag"
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "subscriptions",
+ "name": "examplesubscription1",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/products/exampleProduct')]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/users/exampleUser1')]"
+ ],
+ "properties": {
+ "productId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/exampleServiceName/products/exampleProduct",
+ "userId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/exampleServiceName/users/exampleUser1"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "subscriptions",
+ "name": "examplesubscription2",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/products/exampleProduct')]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/users/exampleUser3')]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/subscriptions/examplesubscription1')]"
+ ],
+ "properties": {
+ "productId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/exampleServiceName/products/exampleProduct",
+ "userId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/exampleServiceName/users/exampleUser3"
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "certificates",
+ "name": "exampleCertificate",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "data": "",
+ "password": ""
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "groups",
+ "name": "exampleGroup",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "displayName": "Example Group Name",
+ "description": "Example group description"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "type": "users",
+ "name": "exampleUser3",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'), '/groups/exampleGroup')]"
+ ]
+ }
+ ]
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "openidConnectProviders",
+ "name": "exampleOpenIdConnectProvider",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "displayName": "exampleOpenIdConnectProviderName",
+ "description": "Description for example OpenId Connect provider",
+ "metadataEndpoint": "https://example-openIdConnect-url.net",
+ "clientId": "exampleClientId",
+ "clientSecret": ""
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "loggers",
+ "name": "exampleLogger",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "loggerType": "azureEventHub",
+ "description": "Description for example logger",
+ "credentials": {
+ "name": "exampleEventHubName",
+ "connectionString": ""
+ }
+ }
+ },
+ {
+ "apiVersion": "2017-03-01",
+ "type": "identityProviders",
+ "name": "google",
+ "dependsOn": [
+ "[concat('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]"
+ ],
+ "properties": {
+ "clientId": "googleClientId",
+ "clientSecret": ""
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT914 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT914
new file mode 100644
index 0000000..9e08cee
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT914
@@ -0,0 +1,485 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902725,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT914",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.apimanagement/service",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT914",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "defaultValue": "constoso@contoso.com",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "defaultValue": "apimPublisher",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Premium"
+ ],
+ "defaultValue": "Developer",
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "apimvnet",
+ "metadata": {
+ "description": "Virtual Network name"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "virtualNetworkAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Address prefix"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet Prefix"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "apim",
+ "metadata": {
+ "description": "Subnet Name"
+ },
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "apimSubnetServiceEndpoints": {
+ "type": "array",
+ "defaultValue": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ],
+ "metadata": {
+ "description": "Service Endpoints enabled on the APIM subnet"
+ },
+ "value": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region where the resources will be deployed"
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice', uniqueString(resourceGroup().id))]",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "apimNsgName": "[concat('apimnsg', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('apimNsgName')]",
+ "apiVersion": "2020-06-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Client_communication_to_API_Management",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Secure_Client_communication_to_API_Management",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management_endpoint_for_Azure_portal_and_Powershell",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3443",
+ "sourceAddressPrefix": "ApiManagement",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_to_sync_Rate_Limit_Inbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 135,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_SQL",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "1433",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Sql",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_for_Log_to_event_Hub_policy",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "5671",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "EventHub",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache_outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Depenedency_To_sync_RateLimit_Outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 165,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_File_Share_for_GIT",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "445",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Azure_Infrastructure_Load_Balancer",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 180,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Publish_DiagnosticLogs_And_Metrics",
+ "properties": {
+ "description": "APIM Logs and Metrics for consumption by admins and your IT team are all part of the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureMonitor",
+ "access": "Allow",
+ "priority": 185,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443",
+ "12000",
+ "1886"
+ ]
+ }
+ },
+ {
+ "name": "Connect_To_SMTP_Relay_For_SendingEmails",
+ "properties": {
+ "description": "APIM features the ability to generate email traffic as part of the data plane and the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Allow",
+ "priority": 190,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "25",
+ "587",
+ "25028"
+ ]
+ }
+ },
+ {
+ "name": "Authenticate_To_Azure_Active_Directory",
+ "properties": {
+ "description": "Connect to Azure Active Directory for Developer Portal Authentication or for Oauth2 flow during any Proxy Authentication",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureActiveDirectory",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "80",
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_Storage",
+ "properties": {
+ "description": "APIM service dependency on Azure Blob and Azure Table Storage",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Publish_Monitoring_Logs",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 300,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Access_KeyVault",
+ "properties": {
+ "description": "Allow APIM service control plane access to KeyVault to refresh secrets",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureKeyVault",
+ "access": "Allow",
+ "priority": 350,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Deny_All_Internet_Outbound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Deny",
+ "priority": 999,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-VNET-NAME",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-VNET-SUBNET1-NAME",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ },
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-VNET-NAME"
+ ],
+ "sku": {
+ "name": "Developer",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest",
+ "virtualNetworkType": "External",
+ "virtualNetworkConfiguration": {
+ "subnetResourceId": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME"
+ },
+ "customProperties": {
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": false
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT915 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT915
new file mode 100644
index 0000000..966a9df
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT915
@@ -0,0 +1,550 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet-publicip/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet-publicip/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902733,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet-publicip/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-external-vnet-publicip/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT915",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.apimanagement/service",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT915",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "defaultValue": "constoso@contoso.com",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "defaultValue": "apimPublisher",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Premium"
+ ],
+ "defaultValue": "Premium",
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "The instance size of this API Management service.This should be in multiple of zones getting deployed."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "apimvnet",
+ "metadata": {
+ "description": "Virtual Network name"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "virtualNetworkAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Address prefix"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet Prefix"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "apim",
+ "metadata": {
+ "description": "Subnet Name"
+ },
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "apimSubnetServiceEndpoints": {
+ "type": "array",
+ "defaultValue": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ],
+ "metadata": {
+ "description": "Service Endpoints enabled on the APIM subnet"
+ },
+ "value": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region where the resources will be deployed"
+ },
+ "value": "FranceCentral"
+ },
+ "availabilityZones": {
+ "type": "array",
+ "defaultValue": [
+ "1",
+ "2"
+ ],
+ "metadata": {
+ "description": "Zone numbers e.g. 1,2,3."
+ }
+ },
+ "publicIpName": {
+ "type": "string",
+ "defaultValue": "myPublicIP",
+ "metadata": {
+ "description": "Name for the Public IP used to access the api management service."
+ }
+ },
+ "publicIpSku": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Standard"
+ ],
+ "metadata": {
+ "description": "SKU for the Public IP used to access the api management service."
+ }
+ },
+ "publicIPAllocationMethod": {
+ "type": "string",
+ "defaultValue": "Static",
+ "allowedValues": [
+ "Static"
+ ],
+ "metadata": {
+ "description": "Allocation method for the Public IP used to access Api Management service. Standard SKU public IP requires `Static` allocation."
+ }
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "defaultValue": "[toLower(concat(parameters('publicIpName'), '-', uniqueString(resourceGroup().id)))]",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the api management service."
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice', uniqueString(resourceGroup().id))]",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "apimNsgName": "[concat('apimnsg', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('apimNsgName')]",
+ "apiVersion": "2020-06-01",
+ "location": "FranceCentral",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Client_communication_to_API_Management",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Secure_Client_communication_to_API_Management",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "Internet",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management_endpoint_for_Azure_portal_and_Powershell",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3443",
+ "sourceAddressPrefix": "ApiManagement",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_to_sync_Rate_Limit_Inbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 135,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_SQL",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "1433",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Sql",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_for_Log_to_event_Hub_policy",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "5671",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "EventHub",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache_outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Depenedency_To_sync_RateLimit_Outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 165,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_File_Share_for_GIT",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "445",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Azure_Infrastructure_Load_Balancer",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6390",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 180,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Publish_DiagnosticLogs_And_Metrics",
+ "properties": {
+ "description": "APIM Logs and Metrics for consumption by admins and your IT team are all part of the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureMonitor",
+ "access": "Allow",
+ "priority": 185,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443",
+ "12000",
+ "1886"
+ ]
+ }
+ },
+ {
+ "name": "Connect_To_SMTP_Relay_For_SendingEmails",
+ "properties": {
+ "description": "APIM features the ability to generate email traffic as part of the data plane and the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Allow",
+ "priority": 190,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "25",
+ "587",
+ "25028"
+ ]
+ }
+ },
+ {
+ "name": "Authenticate_To_Azure_Active_Directory",
+ "properties": {
+ "description": "Connect to Azure Active Directory for Developer Portal Authentication or for Oauth2 flow during any Proxy Authentication",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureActiveDirectory",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "80",
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_Storage",
+ "properties": {
+ "description": "APIM service dependency on Azure Blob and Azure Table Storage",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Publish_Monitoring_Logs",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 300,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Access_KeyVault",
+ "properties": {
+ "description": "Allow APIM service control plane access to KeyVault to refresh secrets",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureKeyVault",
+ "access": "Allow",
+ "priority": 350,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Deny_All_Internet_Outbound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Deny",
+ "priority": 999,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "FranceCentral",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "publicIPAddressVersion": "IPv4",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(concat(parameters('publicIpName'), '-', uniqueString(resourceGroup().id)))]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-VNET-NAME",
+ "location": "FranceCentral",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-VNET-SUBNET1-NAME",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ },
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-01-01-preview",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "FranceCentral",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-VNET-NAME",
+ "Microsoft.Network/publicIPAddresses/publicIPName"
+ ],
+ "sku": {
+ "name": "Premium",
+ "capacity": 2
+ },
+ "zones": "[if(equals(length(parameters('availabilityZones')), 0), json('null'), parameters('availabilityZones'))]",
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest",
+ "virtualNetworkType": "External",
+ "publicIpAddressId": "Microsoft.Network/publicIPAddresses/publicIPName",
+ "virtualNetworkConfiguration": {
+ "subnetResourceId": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME"
+ },
+ "customProperties": {
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": false
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT916 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT916
new file mode 100644
index 0000000..5a8511d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT916
@@ -0,0 +1,185 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-hostname/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-hostname/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902741,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-hostname/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-hostname/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT916",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT916",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Standard",
+ "Premium"
+ ],
+ "defaultValue": "Premium",
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "proxyCustomHostname1": {
+ "type": "string",
+ "metadata": {
+ "description": "Proxy Custom hostname 1."
+ },
+ "value": "proxyHostname.fabrikam.com"
+ },
+ "proxyCustomHostnameBase64EncodedPfxCertificate1": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Base-64 encoded SSL .pfx Certificate for proxy custom hostname."
+ },
+ "value": ""
+ },
+ "proxySSLCertificatePassword1": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Proxy SSL certificate password."
+ },
+ "value": ""
+ },
+ "proxyCustomHostname2": {
+ "type": "string",
+ "metadata": {
+ "description": "Proxy Custom hostname."
+ },
+ "value": "proxyHostname.contoso.com"
+ },
+ "proxyCustomHostnameBase64EncodedPfxCertificate2": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Base-64 encoded SSL .pfx Certificate for proxy custom hostname."
+ },
+ "value": ""
+ },
+ "proxySSLCertificatePassword2": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Proxy SSL certificate password."
+ },
+ "value": ""
+ },
+ "portalCustomHostname": {
+ "type": "string",
+ "metadata": {
+ "description": "Portal Custom hostname."
+ },
+ "value": "portalHostname.contoso.com"
+ },
+ "portalCustomHostnameBase64EncodedPfxCertificate": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Base-64 encoded SSL .pfx Certificate for portal custom hostname."
+ },
+ "value": ""
+ },
+ "portalSSLCertificatePassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Portal SSL certificate password."
+ },
+ "value": ""
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2017-03-01",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "[resourceGroup().location]",
+ "tags": {},
+ "sku": {
+ "name": "Premium",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest",
+ "hostnameConfigurations": [
+ {
+ "type": "Proxy",
+ "hostName": "proxyHostname.fabrikam.com",
+ "encodedCertificate": "",
+ "certificatePassword": "",
+ "negotiateClientCertificate": false
+ },
+ {
+ "type": "Proxy",
+ "hostName": "proxyHostname.contoso.com",
+ "encodedCertificate": "",
+ "certificatePassword": "",
+ "negotiateClientCertificate": false
+ },
+ {
+ "type": "Portal",
+ "hostName": "portalHostname.contoso.com",
+ "encodedCertificate": "",
+ "certificatePassword": "",
+ "negotiateClientCertificate": false
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT917 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT917
new file mode 100644
index 0000000..bf42402
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT917
@@ -0,0 +1,466 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902747,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT917",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.apimanagement/service",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT917",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Premium"
+ ],
+ "defaultValue": "Developer",
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "internalvnet",
+ "metadata": {
+ "description": "Virtual Network name"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "virtualNetworkAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Address prefix"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet Prefix"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "apim",
+ "metadata": {
+ "description": "Subnet Name"
+ },
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "apimSubnetServiceEndpoints": {
+ "type": "array",
+ "defaultValue": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ],
+ "metadata": {
+ "description": "Service Endpoints enabled on the APIM subnet"
+ },
+ "value": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure Region where the resources will be deployed"
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice', uniqueString(resourceGroup().id))]",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "apimNsgName": "[concat('apimnsg', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('apimNsgName')]",
+ "apiVersion": "2020-06-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Client_communication_to_API_Management",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Secure_Client_communication_to_API_Management",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management_endpoint_for_Azure_portal_and_Powershell",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3443",
+ "sourceAddressPrefix": "ApiManagement",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_to_sync_Rate_Limit_Inbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 135,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_SQL",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "1433",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Sql",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_for_Log_to_event_Hub_policy",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "5671",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "EventHub",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache_outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Depenedency_To_sync_RateLimit_Outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 165,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_File_Share_for_GIT",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "445",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Azure_Infrastructure_Load_Balancer",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 180,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Publish_DiagnosticLogs_And_Metrics",
+ "properties": {
+ "description": "APIM Logs and Metrics for consumption by admins and your IT team are all part of the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureMonitor",
+ "access": "Allow",
+ "priority": 185,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443",
+ "12000",
+ "1886"
+ ]
+ }
+ },
+ {
+ "name": "Connect_To_SMTP_Relay_For_SendingEmails",
+ "properties": {
+ "description": "APIM features the ability to generate email traffic as part of the data plane and the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Allow",
+ "priority": 190,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "25",
+ "587",
+ "25028"
+ ]
+ }
+ },
+ {
+ "name": "Authenticate_To_Azure_Active_Directory",
+ "properties": {
+ "description": "Connect to Azure Active Directory for Developer Portal Authentication or for Oauth2 flow during any Proxy Authentication",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureActiveDirectory",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "80",
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_Storage",
+ "properties": {
+ "description": "APIM service dependency on Azure Blob and Azure Table Storage",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Publish_Monitoring_Logs",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 300,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Access_KeyVault",
+ "properties": {
+ "description": "Allow APIM service control plane access to KeyVault to refresh secrets",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureKeyVault",
+ "access": "Allow",
+ "priority": 350,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Deny_All_Internet_Outbound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Deny",
+ "priority": 999,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-VNET-NAME",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-VNET-SUBNET1-NAME",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ },
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-VNET-NAME"
+ ],
+ "sku": {
+ "name": "Developer",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest",
+ "virtualNetworkType": "Internal",
+ "virtualNetworkConfiguration": {
+ "subnetResourceId": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT918 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT918
new file mode 100644
index 0000000..c7c16f8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT918
@@ -0,0 +1,70 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902755,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT918",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT918",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location in which resources will be created"
+ }
+ },
+ "log-analytics-workspace-name": {
+ "type": "string",
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "variables": {
+ "log-analtytics-resource-group": "[resourceGroup().name]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2021-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "PerGB2018"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "logAnalyticsWorkspaceId": {
+ "type": "string",
+ "value": "[resourceId(variables('log-analtytics-resource-group'), 'Microsoft.OperationalInsights/workspaces', parameters('log-analytics-workspace-name'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT919 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT919
new file mode 100644
index 0000000..e00a3e2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT919
@@ -0,0 +1,552 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902761,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-application-gateway/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT919",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/privatednszones",
+ "microsoft.apimanagement/service",
+ "microsoft.network/applicationgateways",
+ "microsoft.insights/components",
+ "microsoft.insights/diagnosticsettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT919",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "base-name": {
+ "type": "string",
+ "metadata": {
+ "description": "This will be used to derive names for all of your resources"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "log-analytics-workspace-id": {
+ "type": "string",
+ "metadata": {
+ "description": "The resource ID for an existing Log Analytics workspace"
+ },
+ "value": "GET-PREREQ-logAnalyticsWorkspaceId"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location in which resources will be created"
+ }
+ },
+ "apim-sku": {
+ "type": "string",
+ "defaultValue": "Developer",
+ "allowedValues": [
+ "Developer",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The edition of Azure API Management to use. This must be an edition that supports VNET Integration. This selection can have a significant impact on consumption cost and 'Developer' is recommended for non-production use."
+ }
+ },
+ "apim-capacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The number of Azure API Management capacity units to provision. For Developer edition, this must equal 1."
+ }
+ },
+ "app-gateway-capacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The number of Azure Application Gateway capacity units to provision. This setting has a direct impact on consumption cost and is recommended to be left at the default value of 1"
+ }
+ },
+ "vnet-address-prefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "The address space (in CIDR notation) to use for the VNET to be deployed in this solution. If integrating with other networked components, there should be no overlap in address space."
+ }
+ },
+ "app-gateway-subnet-prefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "The address space (in CIDR notation) to use for the subnet to be used by Azure Application Gateway. Must be contained in the VNET address space."
+ }
+ },
+ "apim-subnet-prefix": {
+ "type": "string",
+ "defaultValue": "10.0.1.0/24",
+ "metadata": {
+ "description": "The address space (in CIDR notation) to use for the subnet to be used by Azure API Management. Must be contained in the VNET address space."
+ }
+ },
+ "apim-publisher-name": {
+ "type": "string",
+ "defaultValue": "Contoso",
+ "metadata": {
+ "description": "Descriptive name for publisher to be used in the portal"
+ }
+ },
+ "apim-publisher-email": {
+ "type": "string",
+ "defaultValue": "api@contoso.com",
+ "metadata": {
+ "description": "Email adddress associated with publisher"
+ }
+ }
+ },
+ "variables": {
+ "app-insights-name": "GEN-UNIQUE-ai",
+ "vnet-name": "GEN-UNIQUE-vnet",
+ "apim-name": "GEN-UNIQUE-apim",
+ "public-ip-name": "GEN-UNIQUE-pip",
+ "app-gateway-name": "GEN-UNIQUE-agw",
+ "vnet-dns-link-name": "GEN-UNIQUE-vnet-dns-link"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2020-12-01",
+ "name": "GEN-UNIQUE-apim",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Developer",
+ "capacity": 1
+ },
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-vnet"
+ ],
+ "resources": [
+ {
+ "type": "gateways",
+ "apiVersion": "2020-12-01",
+ "name": "my-gateway",
+ "dependsOn": [
+ "Microsoft.ApiManagement/service/GEN-UNIQUE-apim"
+ ],
+ "properties": {
+ "locationData": {
+ "name": "My internal location"
+ },
+ "description": "Self hosted gateway bringing API Management to the edge"
+ }
+ },
+ {
+ "type": "loggers",
+ "apiVersion": "2020-12-01",
+ "name": "AppInsightsLogger",
+ "dependsOn": [
+ "Microsoft.ApiManagement/service/GEN-UNIQUE-apim"
+ ],
+ "properties": {
+ "loggerType": "applicationInsights",
+ "resourceId": "Microsoft.Insights/components/GEN-UNIQUE-ai",
+ "credentials": {
+ "instrumentationKey": "[reference(variables('app-insights-name')).InstrumentationKey]"
+ }
+ }
+ },
+ {
+ "type": "diagnostics",
+ "apiVersion": "2020-12-01",
+ "name": "applicationinsights",
+ "dependsOn": [
+ "Microsoft.ApiManagement/service/GEN-UNIQUE-apim",
+ "Microsoft.ApiManagement/service/loggers/GEN-UNIQUE-apim/AppInsightsLogger"
+ ],
+ "properties": {
+ "alwaysLog": "allErrors",
+ "httpCorrelationProtocol": "Legacy",
+ "verbosity": "information",
+ "logClientIp": true,
+ "loggerId": "Microsoft.ApiManagement/service/loggers//GEN-UNIQUE-apim/AppInsightsLogger",
+ "sampling": {
+ "samplingType": "fixed",
+ "percentage": 100
+ },
+ "frontend": {
+ "request": {
+ "body": {
+ "bytes": 0
+ }
+ },
+ "response": {
+ "body": {
+ "bytes": 0
+ }
+ }
+ },
+ "backend": {
+ "request": {
+ "body": {
+ "bytes": 0
+ }
+ },
+ "response": {
+ "body": {
+ "bytes": 0
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "publisherName": "Contoso",
+ "publisherEmail": "api@contoso.com",
+ "virtualNetworkType": "Internal",
+ "virtualNetworkConfiguration": {
+ "subnetResourceId": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-vnet/apimSubnet"
+ }
+ }
+ },
+ {
+ "scope": "[format('Microsoft.ApiManagement/service/{0}', variables('apim-name'))]",
+ "type": "Microsoft.Insights/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "logToAnalytics",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.ApiManagement/service/GEN-UNIQUE-apim"
+ ],
+ "properties": {
+ "workspaceId": "GET-PREREQ-logAnalyticsWorkspaceId",
+ "logs": [
+ {
+ "category": "GatewayLogs",
+ "enabled": true
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/applicationGateways",
+ "apiVersion": "2020-11-01",
+ "name": "GEN-UNIQUE-agw",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Insights/components/GEN-UNIQUE-ai",
+ "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-pip",
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-vnet"
+ ],
+ "properties": {
+ "sku": {
+ "name": "WAF_v2",
+ "tier": "WAF_v2",
+ "capacity": 1
+ },
+ "gatewayIPConfigurations": [
+ {
+ "name": "appGatewayIpConfig",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE-vnet/appGatewaySubnet"
+ }
+ }
+ }
+ ],
+ "frontendIPConfigurations": [
+ {
+ "name": "appGwPublicFrontendIp",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE-pip"
+ }
+ }
+ }
+ ],
+ "frontendPorts": [
+ {
+ "name": "port_80",
+ "properties": {
+ "port": 80
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "gatewayBackEnd",
+ "properties": {
+ "backendAddresses": [
+ {
+ "fqdn": "GEN-UNIQUE-apim.azure-api.net"
+ }
+ ]
+ }
+ }
+ ],
+ "backendHttpSettingsCollection": [
+ {
+ "name": "apim-gateway-https-setting",
+ "properties": {
+ "port": 443,
+ "protocol": "Https",
+ "cookieBasedAffinity": "Disabled",
+ "hostName": "GEN-UNIQUE-apim.azure-api.net",
+ "pickHostNameFromBackendAddress": false,
+ "requestTimeout": 20,
+ "probe": {
+ "id": "Microsoft.Network/applicationGateways/probes/GEN-UNIQUE-agw/apim-gateway-probe"
+ }
+ }
+ }
+ ],
+ "httpListeners": [
+ {
+ "name": "apim-listener",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/applicationGateways/frontEndIPConfigurations/GEN-UNIQUE-agw/appGwPublicFrontendIp"
+ },
+ "frontendPort": {
+ "id": "Microsoft.Network/applicationGateways/frontEndPorts/GEN-UNIQUE-agw/port_80"
+ },
+ "protocol": "Http",
+ "requireServerNameIndication": false
+ }
+ }
+ ],
+ "requestRoutingRules": [
+ {
+ "name": "apim-routing-rule",
+ "properties": {
+ "ruleType": "Basic",
+ "httpListener": {
+ "id": "Microsoft.Network/applicationGateways/httpListeners/GEN-UNIQUE-agw/apim-listener"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/applicationGateways/backendAddressPools/GEN-UNIQUE-agw/gatewayBackEnd"
+ },
+ "backendHttpSettings": {
+ "id": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection/GEN-UNIQUE-agw/apim-gateway-https-setting"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "apim-gateway-probe",
+ "properties": {
+ "protocol": "Https",
+ "host": "GEN-UNIQUE-apim.azure-api.net",
+ "port": 443,
+ "path": "/status-0123456789abcdef",
+ "interval": 30,
+ "timeout": 120,
+ "unhealthyThreshold": 8,
+ "pickHostNameFromBackendHttpSettings": false,
+ "minServers": 0
+ }
+ }
+ ],
+ "webApplicationFirewallConfiguration": {
+ "enabled": true,
+ "firewallMode": "Detection",
+ "ruleSetType": "OWASP",
+ "ruleSetVersion": "3.2",
+ "requestBodyCheck": true,
+ "maxRequestBodySizeInKb": 128,
+ "fileUploadLimitInMb": 100
+ }
+ }
+ },
+ {
+ "scope": "[format('Microsoft.Network/applicationGateways/{0}', variables('app-gateway-name'))]",
+ "type": "Microsoft.Insights/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "name": "logToAnalytics",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/applicationGateways/GEN-UNIQUE-agw"
+ ],
+ "properties": {
+ "workspaceId": "GET-PREREQ-logAnalyticsWorkspaceId",
+ "logs": [
+ {
+ "category": "ApplicationGatewayAccessLog",
+ "enabled": true
+ },
+ {
+ "category": "ApplicationGatewayPerformanceLog",
+ "enabled": true
+ },
+ {
+ "category": "ApplicationGatewayFirewallLog",
+ "enabled": true
+ }
+ ],
+ "metrics": [
+ {
+ "category": "AllMetrics",
+ "enabled": true
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Insights/components",
+ "apiVersion": "2020-02-02-preview",
+ "name": "GEN-UNIQUE-ai",
+ "location": "[resourceGroup().location]",
+ "kind": "web",
+ "properties": {
+ "Application_Type": "web",
+ "WorkspaceResourceId": "GET-PREREQ-logAnalyticsWorkspaceId"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-11-01",
+ "name": "GEN-UNIQUE-pip",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard",
+ "tier": "Regional"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-11-01",
+ "name": "GEN-UNIQUE-vnet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "type": "subnets",
+ "name": "appGatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.KeyVault",
+ "locations": [
+ "*"
+ ]
+ }
+ ],
+ "privateEndpointNetworkPolicies": "Enabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ },
+ {
+ "type": "subnets",
+ "name": "apimSubnet",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24",
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.KeyVault",
+ "locations": [
+ "*"
+ ]
+ }
+ ],
+ "privateEndpointNetworkPolicies": "Enabled",
+ "privateLinkServiceNetworkPolicies": "Enabled"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2018-09-01",
+ "name": "azure-api.net",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.ApiManagement/service/GEN-UNIQUE-apim",
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE-vnet"
+ ],
+ "resources": [
+ {
+ "condition": true,
+ "type": "A",
+ "apiVersion": "2018-09-01",
+ "name": "GEN-UNIQUE-apim",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/azure-api.net",
+ "Microsoft.ApiManagement/service/GEN-UNIQUE-apim"
+ ],
+ "properties": {
+ "ttl": 36000,
+ "aRecords": [
+ {
+ "ipv4Address": "[reference(resourceId('Microsoft.ApiManagement/service', variables('apim-name'))).privateIPAddresses[0]]"
+ }
+ ]
+ }
+ },
+ {
+ "type": "virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE-vnet-dns-link",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/azure-api.net"
+ ],
+ "properties": {
+ "registrationEnabled": true,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/GEN-UNIQUE-vnet"
+ }
+ }
+ }
+ ],
+ "properties": {}
+ }
+ ],
+ "outputs": {
+ "publicEndpointFqdn": {
+ "type": "string",
+ "value": "[reference(variables('public-ip-name')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT92 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT92
new file mode 100644
index 0000000..1bc3b96
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT92
@@ -0,0 +1,509 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/master-node.json"
+ ],
+ "timestamp": 1642962885965,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/master-node.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT92",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT92",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "vnetID": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmCount": {
+ "type": "int"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec",
+ "vmName": "dnsNamePrefix-mn",
+ "nicName": "dnsNamePrefix-mn-nic",
+ "publicIPAddressName": "dnsNamePrefix-mn-publicIP",
+ "storageAccountName": "nnstorageAccount",
+ "securityGroupName": "dnsNamePrefix-mn-sg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "dnsNamePrefix-mn-sg",
+ "location": "[resourceGroup().location]",
+ "comments": "Shared Resources Network Security Group Rules",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.Web.UI",
+ "properties": {
+ "description": "Allows HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50070",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hiveserver2",
+ "properties": {
+ "description": "Allows Hiveserver traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 102,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hive.Metastore",
+ "properties": {
+ "description": "Allows Hive Metastore traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "9083",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 103,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hue",
+ "properties": {
+ "description": "Allows Hue traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 104,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.ResourceManager",
+ "properties": {
+ "description": "Allows YARN Resource Manager traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8088",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 105,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.JobHistory.Server",
+ "properties": {
+ "description": "Allows YARN JobHistory Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "19888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 106,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Oozie.Server",
+ "properties": {
+ "description": "Allows Oozie Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "11000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 107,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management.Web.UI",
+ "properties": {
+ "description": "Allows Management.Web.UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7180",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 108,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Navigator",
+ "properties": {
+ "description": "Allows Navigator traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7187",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 109,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.dn.Web.UI",
+ "properties": {
+ "description": "Allow HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50075",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.nm.Web.UI",
+ "properties": {
+ "description": "Allow YARN Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8042",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 111,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.JDBC",
+ "properties": {
+ "description": "Allow Impala JDBC traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 112,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.Shell",
+ "properties": {
+ "description": "Allow Impala Shell traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 113,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "RDP",
+ "properties": {
+ "description": "Allow RDP Traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 114,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "copyIndex()nnstorageAccount",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node storage account configurations",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "storageAccountLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "accountType": "storageAccount"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "dnsNamePrefix-mn-publicIPcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node Public IP Address configuration",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "publicIPLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "dnsNamePrefix-mncopyIndex()"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "dnsNamePrefix-mn-niccopyIndex()",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node network interface configuration",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/dnsNamePrefix-mn-publicIPcopyIndex()",
+ "Microsoft.Network/networkSecurityGroups/dnsNamePrefix-mn-sg"
+ ],
+ "copy": {
+ "name": "masterNodeNicLoop",
+ "count": "vmCount"
+ },
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "[concat(parameters('networkSpec').ipOctet01, add(parameters('networkSpec').ipOctet2, div(copyIndex(parameters('networkSpec').ipOctet3), 256)), '.', mod(copyIndex(parameters('networkSpec').ipOctet3), 256))]",
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dnsNamePrefix-mn-publicIPcopyIndex()"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/dnsNamePrefix-mn-sg"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "dnsNamePrefix-mncopyIndex()",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node virtual machines configurations",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "masterNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces/dnsNamePrefix-mn-niccopyIndex()",
+ "Microsoft.Storage/storageAccounts/copyIndex()nnstorageAccount"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/vmSpec"
+ },
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "[reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn]",
+ "adminUsername": "vmSpec",
+ "adminPassword": "vmSpec",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": "false"
+ }
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Redhat",
+ "offer": "RHEL",
+ "sku": "6.8",
+ "version": "6.8.20161028"
+ },
+ "osDisk": {
+ "name": "dnsNamePrefix-mncopyIndex()_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "dnsNamePrefix-mncopyIndex()_DataDisk0",
+ "diskSizeGB": 512,
+ "lun": 0,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-mncopyIndex()_DataDisk1",
+ "diskSizeGB": 512,
+ "lun": 1,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-mncopyIndex()_DataDisk2",
+ "diskSizeGB": 512,
+ "lun": 2,
+ "createOption": "Empty"
+ },
+ {
+ "name": "dnsNamePrefix-mncopyIndex()_DataDisk3",
+ "diskSizeGB": 512,
+ "lun": 3,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dnsNamePrefix-mn-niccopyIndex()"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "dnsNamePrefix-mncopyIndex()/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node VM Extensions and scripts to configure the Cloudera cluster",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "copy": {
+ "name": "nameNodeNicLoop",
+ "count": "vmCount"
+ },
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines/dnsNamePrefix-mncopyIndex()"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/prepare-masternode-disks.sh",
+ "scriptsUri/scripts/initialize-node.sh"
+ ],
+ "commandToExecute": "[concat('sh initialize-node.sh \"', variables('masterIP'), '\" \"', variables('workerIP'), '\" \"', parameters('dnsNamePrefix'), '\" \"', reference(concat(variables('publicIPAddressName'), copyIndex())).dnsSettings.fqdn, '\" ', parameters('clusterSpec').masterNodeCount, ' ', parameters('clusterSpec').dataNodeCount, ' \"', parameters('vmSpec').adminUsername, '\" ', 'masternode', ' >> /home/$ADMINUSER/initialize-datanode.log 2>&1')]"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "fqdn": {
+ "type": "string",
+ "value": "[reference(concat(variables('publicIPAddressName'), '0')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT920 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT920
new file mode 100644
index 0000000..57fd0d0
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT920
@@ -0,0 +1,533 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-publicip/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-publicip/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902769,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-publicip/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-internal-vnet-publicip/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT920",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.apimanagement/service",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT920",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "defaultValue": "constoso@contoso.com",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "defaultValue": "apimPublisher",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Premium"
+ ],
+ "defaultValue": "Premium",
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 2,
+ "metadata": {
+ "description": "The instance size of this API Management service.This should be in multiple of zones getting deployed."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "apimvnet",
+ "metadata": {
+ "description": "Virtual Network name"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "virtualNetworkAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Address prefix"
+ }
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Subnet Prefix"
+ }
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "apim",
+ "metadata": {
+ "description": "Subnet Name"
+ },
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "apimSubnetServiceEndpoints": {
+ "type": "array",
+ "defaultValue": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ },
+ {
+ "service": "Microsoft.KeyVault"
+ }
+ ],
+ "metadata": {
+ "description": "Service Endpoints enabled on the APIM subnet"
+ },
+ "value": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ },
+ {
+ "service": "Microsoft.KeyVault"
+ }
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Azure region where the resources will be deployed"
+ },
+ "value": "FranceCentral"
+ },
+ "availabilityZones": {
+ "type": "array",
+ "defaultValue": [
+ "1",
+ "2"
+ ],
+ "metadata": {
+ "description": "Zone numbers e.g. 1,2,3."
+ }
+ },
+ "publicIpName": {
+ "type": "string",
+ "defaultValue": "myPublicIP",
+ "metadata": {
+ "description": "Name for the Public IP used to access the api management service."
+ }
+ },
+ "publicIpSku": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Standard"
+ ],
+ "metadata": {
+ "description": "SKU for the Public IP used to access the api management service."
+ }
+ },
+ "publicIPAllocationMethod": {
+ "type": "string",
+ "defaultValue": "Static",
+ "allowedValues": [
+ "Static"
+ ],
+ "metadata": {
+ "description": "Allocation method for the Public IP used to access Api Management service. Standard SKU public IP requires `Static` allocation."
+ }
+ },
+ "dnsLabelPrefix": {
+ "type": "string",
+ "defaultValue": "[toLower(concat(parameters('publicIpName'), '-', uniqueString(resourceGroup().id)))]",
+ "metadata": {
+ "description": "Unique DNS Name for the Public IP used to access the api management service."
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice', uniqueString(resourceGroup().id))]",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "apimNsgName": "[concat('apimnsg', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "[variables('apimNsgName')]",
+ "apiVersion": "2020-06-01",
+ "location": "FranceCentral",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "Management_endpoint_for_Azure_portal_and_Powershell",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3443",
+ "sourceAddressPrefix": "ApiManagement",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 120,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 130,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_to_sync_Rate_Limit_Inbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 135,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_SQL",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "1433",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Sql",
+ "access": "Allow",
+ "priority": 140,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_for_Log_to_event_Hub_policy",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "5671",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "EventHub",
+ "access": "Allow",
+ "priority": 150,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Redis_Cache_outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6381-6383",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 160,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Depenedency_To_sync_RateLimit_Outbound",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "4290",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 165,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_File_Share_for_GIT",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "445",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 170,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Azure_Infrastructure_Load_Balancer",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "6390",
+ "sourceAddressPrefix": "AzureLoadBalancer",
+ "destinationAddressPrefix": "VirtualNetwork",
+ "access": "Allow",
+ "priority": 180,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Publish_DiagnosticLogs_And_Metrics",
+ "properties": {
+ "description": "APIM Logs and Metrics for consumption by admins and your IT team are all part of the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureMonitor",
+ "access": "Allow",
+ "priority": 185,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443",
+ "12000",
+ "1886"
+ ]
+ }
+ },
+ {
+ "name": "Connect_To_SMTP_Relay_For_SendingEmails",
+ "properties": {
+ "description": "APIM features the ability to generate email traffic as part of the data plane and the management plane",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Allow",
+ "priority": 190,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "25",
+ "587",
+ "25028"
+ ]
+ }
+ },
+ {
+ "name": "Authenticate_To_Azure_Active_Directory",
+ "properties": {
+ "description": "Connect to Azure Active Directory for Developer Portal Authentication or for Oauth2 flow during any Proxy Authentication",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureActiveDirectory",
+ "access": "Allow",
+ "priority": 200,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "80",
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Dependency_on_Azure_Storage",
+ "properties": {
+ "description": "APIM service dependency on Azure Blob and Azure Table Storage",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Storage",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Publish_Monitoring_Logs",
+ "properties": {
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "443",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureCloud",
+ "access": "Allow",
+ "priority": 300,
+ "direction": "Outbound"
+ }
+ },
+ {
+ "name": "Access_KeyVault",
+ "properties": {
+ "description": "Allow APIM service control plane access to KeyVault to refresh secrets",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "AzureKeyVault",
+ "access": "Allow",
+ "priority": 350,
+ "direction": "Outbound",
+ "destinationPortRanges": [
+ "443"
+ ]
+ }
+ },
+ {
+ "name": "Deny_All_Internet_Outbound",
+ "properties": {
+ "protocol": "*",
+ "sourcePortRange": "*",
+ "destinationPortRange": "*",
+ "sourceAddressPrefix": "VirtualNetwork",
+ "destinationAddressPrefix": "Internet",
+ "access": "Deny",
+ "priority": 999,
+ "direction": "Outbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "FranceCentral",
+ "sku": {
+ "name": "Standard"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Static",
+ "publicIPAddressVersion": "IPv4",
+ "dnsSettings": {
+ "domainNameLabel": "[toLower(concat(parameters('publicIpName'), '-', uniqueString(resourceGroup().id)))]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-06-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "GEN-VNET-NAME",
+ "location": "FranceCentral",
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-VNET-SUBNET1-NAME",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('apimNsgName'))]"
+ },
+ "serviceEndpoints": [
+ {
+ "service": "Microsoft.Storage"
+ },
+ {
+ "service": "Microsoft.Sql"
+ },
+ {
+ "service": "Microsoft.EventHub"
+ },
+ {
+ "service": "Microsoft.KeyVault"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2021-01-01-preview",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "FranceCentral",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-VNET-NAME",
+ "Microsoft.Network/publicIPAddresses/publicIPName"
+ ],
+ "sku": {
+ "name": "Premium",
+ "capacity": 2
+ },
+ "zones": "[if(equals(length(parameters('availabilityZones')), 0), json('null'), parameters('availabilityZones'))]",
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest",
+ "virtualNetworkType": "Internal",
+ "publicIpAddressId": "Microsoft.Network/publicIPAddresses/publicIPName",
+ "virtualNetworkConfiguration": {
+ "subnetResourceId": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME"
+ },
+ "customProperties": {
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": false,
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": false
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT921 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT921
new file mode 100644
index 0000000..4e3f3bf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT921
@@ -0,0 +1,108 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-msi/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-msi/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902775,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-msi/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-msi/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT921",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT921",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1.14562",
+ "templateHash": "3660068246661203948"
+ }
+ },
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Developer",
+ "allowedValues": [
+ "Basic",
+ "Consumption",
+ "Developer",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2020-12-01",
+ "name": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Developer",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest"
+ },
+ "identity": {
+ "type": "SystemAssigned"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT922 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT922
new file mode 100644
index 0000000..293a58b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT922
@@ -0,0 +1,167 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902781,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT922",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT922",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "10945314915065740179"
+ }
+ },
+ "parameters": {
+ "apiManagementServiceName": {
+ "type": "string",
+ "defaultValue": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the API Management service."
+ }
+ },
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of the primary region of API Management service."
+ }
+ },
+ "additionalLocations": {
+ "type": "array",
+ "defaultValue": [
+ "eastus",
+ "westeurope"
+ ],
+ "metadata": {
+ "description": "Additional Locations to setup the ApiManagement gateway."
+ },
+ "value": [
+ "East US",
+ "West Central US"
+ ]
+ },
+ "disableGatewayInAdditionalLocation": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Ability to enable/disable Gateway proxy in any region including primary region."
+ }
+ },
+ "minApiVersionToAllowOnControlPlane": {
+ "type": "string",
+ "defaultValue": "2019-12-01",
+ "allowedValues": [
+ "2019-01-01",
+ "2019-12-01",
+ "2020-06-01-preview"
+ ],
+ "metadata": {
+ "description": "Minimum Api-Version to allow on all clients to Control Plane to prevent users with read-only permissions from accessing service secrets."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2020-12-01",
+ "name": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Premium",
+ "capacity": 1
+ },
+ "properties": {
+ "copy": [
+ {
+ "name": "additionalLocations",
+ "count": 33,
+ "input": {
+ "location": "additionalLocations)[copyIndex(additionalLocations",
+ "sku": {
+ "name": "Premium",
+ "capacity": 1
+ },
+ "disableGateway": false
+ }
+ }
+ ],
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest",
+ "apiVersionConstraint": {
+ "minApiVersion": "2019-12-01"
+ },
+ "customProperties": {
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": "true"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT923 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT923
new file mode 100644
index 0000000..b92cdcc
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT923
@@ -0,0 +1,167 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962902790,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-multiregion/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT923",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT923",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "10945314915065740179"
+ }
+ },
+ "parameters": {
+ "apiManagementServiceName": {
+ "type": "string",
+ "defaultValue": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the API Management service."
+ }
+ },
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "templateTest"
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of the primary region of API Management service."
+ }
+ },
+ "additionalLocations": {
+ "type": "array",
+ "defaultValue": [
+ "eastus",
+ "westeurope"
+ ],
+ "metadata": {
+ "description": "Additional Locations to setup the ApiManagement gateway."
+ },
+ "value": [
+ "USGov Texas",
+ "USGov Arizona"
+ ]
+ },
+ "disableGatewayInAdditionalLocation": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Ability to enable/disable Gateway proxy in any region including primary region."
+ }
+ },
+ "minApiVersionToAllowOnControlPlane": {
+ "type": "string",
+ "defaultValue": "2019-12-01",
+ "allowedValues": [
+ "2019-01-01",
+ "2019-12-01",
+ "2020-06-01-preview"
+ ],
+ "metadata": {
+ "description": "Minimum Api-Version to allow on all clients to Control Plane to prevent users with read-only permissions from accessing service secrets."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2020-12-01",
+ "name": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Premium",
+ "capacity": 1
+ },
+ "properties": {
+ "copy": [
+ {
+ "name": "additionalLocations",
+ "count": 33,
+ "input": {
+ "location": "additionalLocations)[copyIndex(additionalLocations",
+ "sku": {
+ "name": "Premium",
+ "capacity": 1
+ },
+ "disableGateway": false
+ }
+ }
+ ],
+ "publisherEmail": "email@example.com",
+ "publisherName": "templateTest",
+ "apiVersionConstraint": {
+ "minApiVersion": "2019-12-01"
+ },
+ "customProperties": {
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": "true"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT924 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT924
new file mode 100644
index 0000000..ffccfa4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT924
@@ -0,0 +1,128 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-reference-keyvault/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-reference-keyvault/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902799,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-reference-keyvault/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-create-with-reference-keyvault/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT924",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT924",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service."
+ },
+ "value": "admin@fabrikam.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service."
+ },
+ "value": "Fabrikam"
+ },
+ "sku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "defaultValue": "Developer",
+ "metadata": {
+ "description": "The pricing tier of this API Management service."
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "proxyCustomHostname": {
+ "type": "string",
+ "metadata": {
+ "description": "Proxy Custom hostname."
+ },
+ "value": "GEN-SELFSIGNED-CERT-DNSNAME"
+ },
+ "proxyCustomHostnameBase64EncodedPfxCertificate": {
+ "type": "string",
+ "metadata": {
+ "description": "The base 64 encoded certificate issued to domain of the proxy custom hostname."
+ }
+ },
+ "proxySSLCertificatePassword": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Certificate Password."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice1', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Developer",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "admin@fabrikam.com",
+ "publisherName": "Fabrikam",
+ "hostnameConfigurations": [
+ {
+ "type": "Proxy",
+ "hostName": "GEN-SELFSIGNED-CERT-DNSNAME",
+ "encodedCertificate": "proxyCustomHostnameBase64EncodedPfxCertificate",
+ "certificatePassword": "",
+ "negotiateClientCertificate": false
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT925 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT925
new file mode 100644
index 0000000..bef9721
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT925
@@ -0,0 +1,233 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-key-vault-create/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-key-vault-create/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902807,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-key-vault-create/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-key-vault-create/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT925",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.authorization/roleassignments",
+ "microsoft.apimanagement/service",
+ "microsoft.keyvault/vaults/secrets",
+ "microsoft.keyvault/vaults",
+ "microsoft.managedidentity/userassignedidentities"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT925",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "17903284954599746970"
+ }
+ },
+ "parameters": {
+ "apiManagementServiceName": {
+ "type": "string",
+ "defaultValue": "[format('apim-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the API Management Service to provision"
+ }
+ },
+ "publisherEmail": {
+ "type": "string",
+ "defaultValue": "contoso@contoso.com",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ }
+ },
+ "publisherName": {
+ "type": "string",
+ "defaultValue": "Contoso",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ }
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Basic",
+ "Consumption",
+ "Developer",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "keyVaultName": {
+ "type": "string",
+ "defaultValue": "[format('kv-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the KeyVault to provision"
+ }
+ },
+ "sslCertValue": {
+ "type": "secureString",
+ "metadata": {
+ "description": "The base64 encoded SSL certificate in PFX format to be stored in Key Vault. CN and SAN must match the custom hostname of API Management Service."
+ },
+ "value": "MIIKowIBAzCCCl8GCSqGSIb3DQEHAaCCClAEggpMMIIKSDCCBiEGCSqGSIb3DQEHAaCCBhIEggYOMIIGCjCCBgYGCyqGSIb3DQEMCgECoIIE9jCCBPIwHAYKKoZIhvcNAQwBAzAOBAijJwDgqprlyQICB9AEggTQsGwdrUIvVy9LkdjT4bTssBJck84za2ctyxo1a0WLLvzlm3Gs2q0hUBgcEvqmz0vYFrIBEAvpHNmTgOuLl0+0iHvy0nwCRwoLmqJszJBayDfDtFsWwSO/Q88rzMR4iaycwCg0VaET3Fc60ZLtByJrR05DEq1NZegKxttTUluslKTCWZZnnaskYxMLMAhq9xLHW0dxqNDs9NS6hMBVUzGOxr1JtLR/lvyHYHOPC9oPMVJW2J0xn3tKWj1xqRp6M9via1W6/4Nh4zQOaJ0c2Kvi/MRTLbN31qXjGCRYM+uUHc7/KBtKTDuUjOL71NSiGWNTfNZBRxxtGWXA8f/gIcWsPSQC8lO0g5nrTXaUqb5bQ+vRHrI3a37rTrLxw5tp5d3zZq9tSJx0w7FG8Wnl978ZgwN43KPSYfO807mT9a+Ghew1JBEz+ezQgI2c/HmaYOQvnzl02dRL25Wx7EnuDHAsbL68pH5dQjBQioxDWOFMwpukZjlrvwUYItOKGLq6oM8wm+lBYchHaCIplplwE6OKG/wH5BtMYL206qcl0/rzieub+USG8uibqhY1URW5dTtLdWa3t+ia5frk84aVIn4dterS6jyCNUQ8X/PZb2wChOKoubqZUwIvBK9f1r5MSZCk/x2wC9ctZDpqkEM1ljGEUNKqb6oq+ESiJD+vRnS2sHpsgUYYQOijznoxbvGEKPDzpZ+dheiPVnCm9T39y+km2c4GK9z/i731g1tM+6Ba1Fzv+Qfd5oNHcN76aq7r3P8tsTZH2685AIe7/+sYj0HON/xW2s33sgr3e5aBT3vk86LlTGiga7LfgITresfhSPh82iqDS/Pv1bkWbdSioG5RbC0JZEuj6Tza8cYZbx5gL5KEmM+K3qxowa/jvltPKqXx9HAOXECfMXtW9tql/xS87D1c5R6mKuxv33sp30Nm4TZg7Dx1UwzThTlO1jrnSYTwFwoTEvc6e/hkjnjwvKOl2MJWyQ3WK6ZUKCGAw2M/+Hbf4ugysebaDsrQZdq8c5nRHvdQYgMSwsRO6Dc0/MUNGuuqa9g1GC4+SWRpAfmIfFjrcemjkEjvhYJ6Y0/+nj4qRX7ndzUny1OkrTsVL20S0NZ/iEC8pccgpW3N4SzEz3SPYQhumrTHcIZ6FHDYMgrUzsGqxbxigExh+Ezy4a2dkmZRvQjZX7LDSuKHtiOi2lEY62X++VBrgs841LDnZs5PIrX3CA4u8Jr1KJ/yJNFJe/K0W6RN4sFovroseb/G5PsmNo2pzJub3ZVEafMIw3RL3GD8aexm4+ryItltIzonTqGp9byV+wx/Z66EpEXmh+mM1PQ31Go4M4QNKnk/RQ6QK3OwL992g3hLg4zYXLytGn1beB1A/eg13hzZFWRmcRiZY1LgHvwaClPvrKH+iWxp7uINKhQEBJVRwew3nXnS1FBbHMqAtBdaZW85bTjy6gxvvgjs4BzRamYf4TyOBX8sa9gtYip0Dw2+XlzeeNwHkPp4zG7Fli4bxUhv82o8aI/9A2WyVENB6xx2TW746gU94D2+HTpV9iDMCEL/UC28FKTHM4smoow+j7/6WMSEnL0ENsbivW13y0sNgqnWbl8Utgc/mS/5x83mOrAtkbsGaRrU46VLyHSLcj7228nP6RUxgfwwDQYJKwYBBAGCNxECMQAwEwYJKoZIhvcNAQkVMQYEBAEAAAAwWwYJKoZIhvcNAQkUMU4eTAB7AEUAMQBDAEYARAA5ADEAQQAtADAAMwBFAEMALQA0ADYARQBBAC0AQgBCAEQAOQAtADIANwBCADUAQQBFADEANAAyADAANwA2AH0weQYJKwYBBAGCNxEBMWweagBNAGkAYwByAG8AcwBvAGYAdAAgAEUAbgBoAGEAbgBjAGUAZAAgAFIAUwBBACAAYQBuAGQAIABBAEUAUwAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIwggQfBgkqhkiG9w0BBwagggQQMIIEDAIBADCCBAUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEDMA4ECLx1ZL9/77aXAgIH0ICCA9ixwELgqEX2eMK+lmMG6Wn43k26bDFIcGwetXe4iRxZXSx1FMqXw3OZ6G1koxNuFmH1q0T9cu0q+ULxulD7qpzCdxIeaMXpygMvnGI3dV//lyPh3GVS2thxDS02+rs3mNQrnLSCDFhblNshpKitUeV6HU1CmjxsOv3mR5IwB/J+4fT+P+zPhjnE7HA6FzLwdNqYNxO4lXFTznImDfLzHOsUPcU49pMdpngz5FNCNkyCTnCSJIDqr0jT2gF/vJC3sDAzowUmcy6v+d0rfGN6HoC6PAtrJLQapJ9LtAivlpqaKuGcbtCGQrAXFHTgKWg1MB2oBWfAbj8IMFJ2lapPE2To8FDvJFnHhKtNfxA2BAYGtyXHpLAi/l6JiCNAcwqXToEECqugxE6ecbP2bIm6dpPy+gQ6OJR5rHmPJG6A6WCLFFpg4kULByOMM/8vTsuXL6V4/9cRXRrkZChkec4XqbhKFQaYDDXFsEe7EVDxZZlc1keDBZyS2K8zf6n0DOSOv3cy244r7g+b3oeTAJvRy2sfnn8MeDI5JqvWd6f8fZYYDLlNetFwcoieh7zie0E8mPrprPY/sDuGbgyv+qll2QscNtpo+ekfHlsjgt9XdppyzqPdNsI/fTGjp51pzbeky8HegF401G5N6Vl0bV7DvWIKfEz66qg7LAhnY2Oql+IX/hbcAtQt3ZX3RAW9u1EeSm5rVtqgkju6F9O0zBpFKCFAvz/plxnA1DsJlUoQYQ4ybFY7YjvhufjtleH1aYOd8ADNJqDu2hvNkWLok/AIFd2KLgYu9070NadhpSUlX/ZIfoO9snXd++5lHUKAjKjM3NWFCid8V236RLq+aW6SsRb8BwwrjPOHNyx2rpjAO/RYhHv0EHHQoWb+swyFw0gLZXHzbrroN53pnUbdooC77k7OM542SblJ7axHNuAEWrJoHmMRGqtDkxrt8FWwX4IUhhMb+L8N2ykhEBbs39KoZjD/AIkqWNjOT8f/9is9ohoXlTsGmJUVJ2OdCrDML1uuXj7Pawy1HPfEw0NIW58Jabi61LQhTmOG709/SymmvCoM8CuIZQuw2c3/1XU4+jzEZii0q1ua++KZOQowGaCK14xkdJjNsxncTHdZ6i1KfUpQN+BBvemVTCyqYN9AU1KDdBEuvsmiYujbxfiP9ya7VYwkQ0fgug9dGYiQzToR1i/TYvaFSaoxGAN+Pr3yLe3TiGn1MuZ1wAu3BVt80sCnvuD9Ej4LF4gYOl8VtVpQyIltv0iUguJCR1HACl8+RyHdMDeOTMbf2jINRl54YQOS6yL3JICopRvJfDQwOzAfMAcGBSsOAwIaBBQihebATtl9JRN/fE5S0viAdK9bJgQUtQGA+yLV771Yqoe3AvUTSfyOODkCAgfQ"
+ },
+ "gatewayCustomHostname": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the gateway custom hostname"
+ },
+ "value": "gateway.apimtesting.net"
+ }
+ },
+ "functions": [],
+ "variables": {
+ "identityName": "[format('id-{0}', uniqueString(resourceGroup().id))]",
+ "keyVaultSecretsUserRoleDefinitionId": "4633458b-17de-408a-b874-0445c86b69e6"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "apiVersion": "2018-11-30",
+ "name": "[format('id-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults",
+ "apiVersion": "2021-06-01-preview",
+ "name": "[format('kv-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "standard",
+ "family": "A"
+ },
+ "tenantId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))).tenantId]",
+ "enableRbacAuthorization": true,
+ "enableSoftDelete": true
+ },
+ "dependsOn": [
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[format('id-{0}', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "Microsoft.KeyVault/vaults/secrets",
+ "apiVersion": "2019-09-01",
+ "name": "[format('{0}/sslCert', parameters('keyVaultName'))]",
+ "properties": {
+ "value": "MIIKowIBAzCCCl8GCSqGSIb3DQEHAaCCClAEggpMMIIKSDCCBiEGCSqGSIb3DQEHAaCCBhIEggYOMIIGCjCCBgYGCyqGSIb3DQEMCgECoIIE9jCCBPIwHAYKKoZIhvcNAQwBAzAOBAijJwDgqprlyQICB9AEggTQsGwdrUIvVy9LkdjT4bTssBJck84za2ctyxo1a0WLLvzlm3Gs2q0hUBgcEvqmz0vYFrIBEAvpHNmTgOuLl0+0iHvy0nwCRwoLmqJszJBayDfDtFsWwSO/Q88rzMR4iaycwCg0VaET3Fc60ZLtByJrR05DEq1NZegKxttTUluslKTCWZZnnaskYxMLMAhq9xLHW0dxqNDs9NS6hMBVUzGOxr1JtLR/lvyHYHOPC9oPMVJW2J0xn3tKWj1xqRp6M9via1W6/4Nh4zQOaJ0c2Kvi/MRTLbN31qXjGCRYM+uUHc7/KBtKTDuUjOL71NSiGWNTfNZBRxxtGWXA8f/gIcWsPSQC8lO0g5nrTXaUqb5bQ+vRHrI3a37rTrLxw5tp5d3zZq9tSJx0w7FG8Wnl978ZgwN43KPSYfO807mT9a+Ghew1JBEz+ezQgI2c/HmaYOQvnzl02dRL25Wx7EnuDHAsbL68pH5dQjBQioxDWOFMwpukZjlrvwUYItOKGLq6oM8wm+lBYchHaCIplplwE6OKG/wH5BtMYL206qcl0/rzieub+USG8uibqhY1URW5dTtLdWa3t+ia5frk84aVIn4dterS6jyCNUQ8X/PZb2wChOKoubqZUwIvBK9f1r5MSZCk/x2wC9ctZDpqkEM1ljGEUNKqb6oq+ESiJD+vRnS2sHpsgUYYQOijznoxbvGEKPDzpZ+dheiPVnCm9T39y+km2c4GK9z/i731g1tM+6Ba1Fzv+Qfd5oNHcN76aq7r3P8tsTZH2685AIe7/+sYj0HON/xW2s33sgr3e5aBT3vk86LlTGiga7LfgITresfhSPh82iqDS/Pv1bkWbdSioG5RbC0JZEuj6Tza8cYZbx5gL5KEmM+K3qxowa/jvltPKqXx9HAOXECfMXtW9tql/xS87D1c5R6mKuxv33sp30Nm4TZg7Dx1UwzThTlO1jrnSYTwFwoTEvc6e/hkjnjwvKOl2MJWyQ3WK6ZUKCGAw2M/+Hbf4ugysebaDsrQZdq8c5nRHvdQYgMSwsRO6Dc0/MUNGuuqa9g1GC4+SWRpAfmIfFjrcemjkEjvhYJ6Y0/+nj4qRX7ndzUny1OkrTsVL20S0NZ/iEC8pccgpW3N4SzEz3SPYQhumrTHcIZ6FHDYMgrUzsGqxbxigExh+Ezy4a2dkmZRvQjZX7LDSuKHtiOi2lEY62X++VBrgs841LDnZs5PIrX3CA4u8Jr1KJ/yJNFJe/K0W6RN4sFovroseb/G5PsmNo2pzJub3ZVEafMIw3RL3GD8aexm4+ryItltIzonTqGp9byV+wx/Z66EpEXmh+mM1PQ31Go4M4QNKnk/RQ6QK3OwL992g3hLg4zYXLytGn1beB1A/eg13hzZFWRmcRiZY1LgHvwaClPvrKH+iWxp7uINKhQEBJVRwew3nXnS1FBbHMqAtBdaZW85bTjy6gxvvgjs4BzRamYf4TyOBX8sa9gtYip0Dw2+XlzeeNwHkPp4zG7Fli4bxUhv82o8aI/9A2WyVENB6xx2TW746gU94D2+HTpV9iDMCEL/UC28FKTHM4smoow+j7/6WMSEnL0ENsbivW13y0sNgqnWbl8Utgc/mS/5x83mOrAtkbsGaRrU46VLyHSLcj7228nP6RUxgfwwDQYJKwYBBAGCNxECMQAwEwYJKoZIhvcNAQkVMQYEBAEAAAAwWwYJKoZIhvcNAQkUMU4eTAB7AEUAMQBDAEYARAA5ADEAQQAtADAAMwBFAEMALQA0ADYARQBBAC0AQgBCAEQAOQAtADIANwBCADUAQQBFADEANAAyADAANwA2AH0weQYJKwYBBAGCNxEBMWweagBNAGkAYwByAG8AcwBvAGYAdAAgAEUAbgBoAGEAbgBjAGUAZAAgAFIAUwBBACAAYQBuAGQAIABBAEUAUwAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIwggQfBgkqhkiG9w0BBwagggQQMIIEDAIBADCCBAUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEDMA4ECLx1ZL9/77aXAgIH0ICCA9ixwELgqEX2eMK+lmMG6Wn43k26bDFIcGwetXe4iRxZXSx1FMqXw3OZ6G1koxNuFmH1q0T9cu0q+ULxulD7qpzCdxIeaMXpygMvnGI3dV//lyPh3GVS2thxDS02+rs3mNQrnLSCDFhblNshpKitUeV6HU1CmjxsOv3mR5IwB/J+4fT+P+zPhjnE7HA6FzLwdNqYNxO4lXFTznImDfLzHOsUPcU49pMdpngz5FNCNkyCTnCSJIDqr0jT2gF/vJC3sDAzowUmcy6v+d0rfGN6HoC6PAtrJLQapJ9LtAivlpqaKuGcbtCGQrAXFHTgKWg1MB2oBWfAbj8IMFJ2lapPE2To8FDvJFnHhKtNfxA2BAYGtyXHpLAi/l6JiCNAcwqXToEECqugxE6ecbP2bIm6dpPy+gQ6OJR5rHmPJG6A6WCLFFpg4kULByOMM/8vTsuXL6V4/9cRXRrkZChkec4XqbhKFQaYDDXFsEe7EVDxZZlc1keDBZyS2K8zf6n0DOSOv3cy244r7g+b3oeTAJvRy2sfnn8MeDI5JqvWd6f8fZYYDLlNetFwcoieh7zie0E8mPrprPY/sDuGbgyv+qll2QscNtpo+ekfHlsjgt9XdppyzqPdNsI/fTGjp51pzbeky8HegF401G5N6Vl0bV7DvWIKfEz66qg7LAhnY2Oql+IX/hbcAtQt3ZX3RAW9u1EeSm5rVtqgkju6F9O0zBpFKCFAvz/plxnA1DsJlUoQYQ4ybFY7YjvhufjtleH1aYOd8ADNJqDu2hvNkWLok/AIFd2KLgYu9070NadhpSUlX/ZIfoO9snXd++5lHUKAjKjM3NWFCid8V236RLq+aW6SsRb8BwwrjPOHNyx2rpjAO/RYhHv0EHHQoWb+swyFw0gLZXHzbrroN53pnUbdooC77k7OM542SblJ7axHNuAEWrJoHmMRGqtDkxrt8FWwX4IUhhMb+L8N2ykhEBbs39KoZjD/AIkqWNjOT8f/9is9ohoXlTsGmJUVJ2OdCrDML1uuXj7Pawy1HPfEw0NIW58Jabi61LQhTmOG709/SymmvCoM8CuIZQuw2c3/1XU4+jzEZii0q1ua++KZOQowGaCK14xkdJjNsxncTHdZ6i1KfUpQN+BBvemVTCyqYN9AU1KDdBEuvsmiYujbxfiP9ya7VYwkQ0fgug9dGYiQzToR1i/TYvaFSaoxGAN+Pr3yLe3TiGn1MuZ1wAu3BVt80sCnvuD9Ej4LF4gYOl8VtVpQyIltv0iUguJCR1HACl8+RyHdMDeOTMbf2jINRl54YQOS6yL3JICopRvJfDQwOzAfMAcGBSsOAwIaBBQihebATtl9JRN/fE5S0viAdK9bJgQUtQGA+yLV771Yqoe3AvUTSfyOODkCAgfQ",
+ "contentType": "application/x-pkcs12",
+ "attributes": {
+ "enabled": true
+ }
+ },
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[format('kv-{0}', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "scope": "[format('Microsoft.KeyVault/vaults/{0}', parameters('keyVaultName'))]",
+ "name": "[guid(variables('keyVaultSecretsUserRoleDefinitionId'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName')))]",
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('keyVaultSecretsUserRoleDefinitionId'))]",
+ "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))).principalId]",
+ "principalType": "ServicePrincipal"
+ },
+ "dependsOn": [
+ "Microsoft.KeyVault/vaults/[format('kv-{0}', uniqueString(resourceGroup().id))]",
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[format('id-{0}', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2021-04-01-preview",
+ "name": "[format('apim-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "identity": {
+ "type": "UserAssigned",
+ "userAssignedIdentities": {
+ "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')))]": {}
+ }
+ },
+ "sku": {
+ "name": "Standard",
+ "capacity": 1
+ },
+ "properties": {
+ "hostnameConfigurations": [
+ {
+ "type": "Proxy",
+ "hostName": "gateway.apimtesting.net",
+ "keyVaultId": "[reference(resourceId('Microsoft.KeyVault/vaults/secrets', split(format('{0}/sslCert', parameters('keyVaultName')), '/')[0], split(format('{0}/sslCert', parameters('keyVaultName')), '/')[1])).secretUri]",
+ "identityClientId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))).clientId]",
+ "defaultSslBinding": true
+ }
+ ],
+ "publisherEmail": "contoso@contoso.com",
+ "publisherName": "Contoso",
+ "customProperties": {
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": "false",
+ "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": "true"
+ }
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.KeyVault/vaults/secrets', split(format('{0}/sslCert', parameters('keyVaultName')), '/')[0], split(format('{0}/sslCert', parameters('keyVaultName')), '/')[1])]",
+ "Microsoft.ManagedIdentity/userAssignedIdentities/[format('id-{0}', uniqueString(resourceGroup().id))]"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT926 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT926
new file mode 100644
index 0000000..35cdf73
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT926
@@ -0,0 +1,142 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-oms-integration/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-logs-oms-integration/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902816,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-oms-integration/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-logs-oms-integration/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT926",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.apimanagement/service/providers/diagnosticsettings",
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT926",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "apiManagementPublisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "apiManagementPublisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "examplePublisher"
+ },
+ "apiManagementSku": {
+ "type": "string",
+ "allowedValues": [
+ "Developer",
+ "Standard",
+ "Premium"
+ ],
+ "defaultValue": "Developer",
+ "metadata": {
+ "description": "The pricing tiers of this API Management service"
+ }
+ },
+ "apiManagementSkuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "omsSku": {
+ "type": "string",
+ "defaultValue": "free",
+ "allowedValues": [
+ "free",
+ "standalone",
+ "pernode"
+ ],
+ "metadata": {
+ "description": "Select the SKU for your workspace"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "apiManagementServiceName": "[concat('apiservice', uniqueString(resourceGroup().id))]",
+ "omsWorkspaceName": "[concat('omsworkspace', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "name": "[variables('apiManagementServiceName')]",
+ "type": "Microsoft.ApiManagement/service",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Developer",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "examplePublisher"
+ }
+ },
+ {
+ "name": "[variables('omsWorkspaceName')]",
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2015-11-01-preview",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "free"
+ }
+ }
+ },
+ {
+ "name": "[concat(variables('apiManagementServiceName'), '/', 'Microsoft.Insights/service')]",
+ "type": "Microsoft.ApiManagement/service/providers/diagnosticSettings",
+ "apiVersion": "2015-07-01",
+ "dependsOn": [
+ "[resourceId('Microsoft.ApiManagement/service/', variables('apiManagementServiceName'))]",
+ "[resourceId('Microsoft.OperationalInsights/workspaces/', variables('omsWorkspaceName'))]"
+ ],
+ "properties": {
+ "workspaceId": "[resourceId('Microsoft.OperationalInsights/workspaces', variables('omsWorkspaceName'))]",
+ "logs": [
+ {
+ "category": "GatewayLogs",
+ "enabled": true
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT927 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT927
new file mode 100644
index 0000000..d4d3793
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT927
@@ -0,0 +1,76 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.apimanagement/service/apis/policies.json"
+ ],
+ "timestamp": 1642962902825,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.apimanagement/service/apis/policies.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT927",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service/apis/policies"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT927",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "existingApiManagementResourceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of existing Api Management service"
+ }
+ },
+ "apiName": {
+ "type": "string",
+ "metadata": {
+ "description": "The Api Name within the Api Management to apply policy to. eg: 'my-billing-apis'. This template does not apply policy globally"
+ }
+ },
+ "logToEventhubLoggerName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of 'log-to-eventhub' logger"
+ }
+ },
+ "log2EHPolicyXml": {
+ "type": "string",
+ "defaultValue": "[concat('\r\n \r\n \r\n @{\r\n var body = context.Request.Body?.As<string>(true);\r\n var MAX_BODY_SIZE_FOR_EH = 145000;\r\n var origBodyLen = (null != body) ? body.Length : 0;\r\n if (MAX_BODY_SIZE_FOR_EH < origBodyLen){\r\n body = body.Remove(MAX_BODY_SIZE_FOR_EH);\r\n }\r\n var headers = context.Request.Headers\r\n .Where(h => h.Key != \"Ocp-Apim-Subscription-Key\")\r\n .Select(h => string.Format(\"{0}: {1}\", h.Key, String.Join(\", \", h.Value).Replace(\"\\\"\", \"\\\\\\\"\")))\r\n .ToArray<string>();\r\n var headerString = (headers.Any()) ? string.Join(\";;\", headers) : string.Empty;\r\n var messageId = context.Variables[\"message-id\"];\r\n var jwtToken = context.Request.Headers.GetValueOrDefault(\"Authorization\",\"\").AsJwt();\r\n var userId = (context.User != null && context.User.Id != null) ? context.User.Id : (jwtToken != null && jwtToken.Subject != null ? jwtToken.Subject : null);\r\n var companyId = \"\";\r\n var cru = new JObject();\r\n if (context.User != null) {\r\n cru.Add(\"Email\", context.User.Email);\r\n cru.Add(\"Id\", context.User.Id);\r\n cru.Add(\"FirstName\", context.User.FirstName);\r\n cru.Add(\"LastName\", context.User.LastName);\r\n }\r\n var crus = System.Convert.ToBase64String(Encoding.UTF8.GetBytes(cru.ToString()));\r\n var requestBody = (body != null ? System.Convert.ToBase64String(Encoding.UTF8.GetBytes(body)) : null);\r\n string metadata = $@\"\";\r\n var request = $@\"\r\n \"\"event_type\"\": \"\"request\"\",\r\n \"\"message-id\"\": \"\"{messageId}\"\",\r\n \"\"method\"\": \"\"{context.Request.Method}\"\",\r\n \"\"ip_address\"\": \"\"{context.Request.IpAddress}\"\",\r\n \"\"uri\"\": \"\"{context.Request.OriginalUrl}\"\",\r\n \"\"user_id\"\": \"\"{userId}\"\",\r\n \"\"contextRequestUser\"\": \"\"{crus}\"\",\r\n \"\"company_id\"\": \"\"{companyId}\"\",\r\n \"\"request_headers\"\": \"\"{headerString}\"\",\r\n \"\"request_body\"\": \"\"{requestBody}\"\",\r\n \"\"metadata\"\": \"\"{metadata}\"\"\r\n \";\r\n return \"{\" + request + \"}\";\r\n }\r\n \r\n \r\n \r\n \r\n \r\n @{\r\n var body = context.Response.Body?.As<string>(true);\r\n var MAX_BODY_SIZE_FOR_EH = 145000;\r\n var origBodyLen = (null != body) ? body.Length : 0;\r\n if (MAX_BODY_SIZE_FOR_EH < origBodyLen){\r\n body = body.Remove(MAX_BODY_SIZE_FOR_EH);\r\n }\r\n var headers = context.Response.Headers\r\n .Select(h => string.Format(\"{0}: {1}\", h.Key, String.Join(\", \", h.Value).Replace(\"\\\"\", \"\\\\\\\"\")))\r\n .ToArray<string>();\r\n var headerString = (headers.Any()) ? string.Join(\";;\", headers): string.Empty;\r\n var messageId = context.Variables[\"message-id\"];\r\n var responseBody = (body != null ? System.Convert.ToBase64String(Encoding.UTF8.GetBytes(body)) : null);\r\n var response = $@\"\r\n \"\"event_type\"\": \"\"response\"\",\r\n \"\"orig_body_len\"\": \"\"{origBodyLen}\"\",\r\n \"\"message-id\"\": \"\"{messageId}\"\",\r\n \"\"status_code\"\": \"\"{context.Response.StatusCode}\"\",\r\n \"\"response_headers\"\": \"\"{headerString}\"\",\r\n \"\"response_body\"\": \"\"{responseBody}\"\"\r\n \";\r\n return \"{\" + response + \"}\";\r\n }\r\n \r\n \r\n \r\n \r\n')]",
+ "metadata": {
+ "description": "The xml blob that will completely overwrite existing value"
+ }
+ },
+ "tags": {
+ "type": "Object"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service/apis/policies",
+ "apiVersion": "2020-12-01",
+ "name": "existingApiManagementResourceName/apiName/policy",
+ "tags": "tags",
+ "properties": {
+ "value": "[concat('\r\n \r\n \r\n @{\r\n var body = context.Request.Body?.As<string>(true);\r\n var MAX_BODY_SIZE_FOR_EH = 145000;\r\n var origBodyLen = (null != body) ? body.Length : 0;\r\n if (MAX_BODY_SIZE_FOR_EH < origBodyLen){\r\n body = body.Remove(MAX_BODY_SIZE_FOR_EH);\r\n }\r\n var headers = context.Request.Headers\r\n .Where(h => h.Key != \"Ocp-Apim-Subscription-Key\")\r\n .Select(h => string.Format(\"{0}: {1}\", h.Key, String.Join(\", \", h.Value).Replace(\"\\\"\", \"\\\\\\\"\")))\r\n .ToArray<string>();\r\n var headerString = (headers.Any()) ? string.Join(\";;\", headers) : string.Empty;\r\n var messageId = context.Variables[\"message-id\"];\r\n var jwtToken = context.Request.Headers.GetValueOrDefault(\"Authorization\",\"\").AsJwt();\r\n var userId = (context.User != null && context.User.Id != null) ? context.User.Id : (jwtToken != null && jwtToken.Subject != null ? jwtToken.Subject : null);\r\n var companyId = \"\";\r\n var cru = new JObject();\r\n if (context.User != null) {\r\n cru.Add(\"Email\", context.User.Email);\r\n cru.Add(\"Id\", context.User.Id);\r\n cru.Add(\"FirstName\", context.User.FirstName);\r\n cru.Add(\"LastName\", context.User.LastName);\r\n }\r\n var crus = System.Convert.ToBase64String(Encoding.UTF8.GetBytes(cru.ToString()));\r\n var requestBody = (body != null ? System.Convert.ToBase64String(Encoding.UTF8.GetBytes(body)) : null);\r\n string metadata = $@\"\";\r\n var request = $@\"\r\n \"\"event_type\"\": \"\"request\"\",\r\n \"\"message-id\"\": \"\"{messageId}\"\",\r\n \"\"method\"\": \"\"{context.Request.Method}\"\",\r\n \"\"ip_address\"\": \"\"{context.Request.IpAddress}\"\",\r\n \"\"uri\"\": \"\"{context.Request.OriginalUrl}\"\",\r\n \"\"user_id\"\": \"\"{userId}\"\",\r\n \"\"contextRequestUser\"\": \"\"{crus}\"\",\r\n \"\"company_id\"\": \"\"{companyId}\"\",\r\n \"\"request_headers\"\": \"\"{headerString}\"\",\r\n \"\"request_body\"\": \"\"{requestBody}\"\",\r\n \"\"metadata\"\": \"\"{metadata}\"\"\r\n \";\r\n return \"{\" + request + \"}\";\r\n }\r\n \r\n \r\n \r\n \r\n \r\n @{\r\n var body = context.Response.Body?.As<string>(true);\r\n var MAX_BODY_SIZE_FOR_EH = 145000;\r\n var origBodyLen = (null != body) ? body.Length : 0;\r\n if (MAX_BODY_SIZE_FOR_EH < origBodyLen){\r\n body = body.Remove(MAX_BODY_SIZE_FOR_EH);\r\n }\r\n var headers = context.Response.Headers\r\n .Select(h => string.Format(\"{0}: {1}\", h.Key, String.Join(\", \", h.Value).Replace(\"\\\"\", \"\\\\\\\"\")))\r\n .ToArray<string>();\r\n var headerString = (headers.Any()) ? string.Join(\";;\", headers): string.Empty;\r\n var messageId = context.Variables[\"message-id\"];\r\n var responseBody = (body != null ? System.Convert.ToBase64String(Encoding.UTF8.GetBytes(body)) : null);\r\n var response = $@\"\r\n \"\"event_type\"\": \"\"response\"\",\r\n \"\"orig_body_len\"\": \"\"{origBodyLen}\"\",\r\n \"\"message-id\"\": \"\"{messageId}\"\",\r\n \"\"status_code\"\": \"\"{context.Response.StatusCode}\"\",\r\n \"\"response_headers\"\": \"\"{headerString}\"\",\r\n \"\"response_body\"\": \"\"{responseBody}\"\"\r\n \";\r\n return \"{\" + response + \"}\";\r\n }\r\n \r\n \r\n \r\n \r\n')]",
+ "format": "xml"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT928 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT928
new file mode 100644
index 0000000..5c95bfb
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT928
@@ -0,0 +1,98 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.apimanagement/service/loggers.json"
+ ],
+ "timestamp": 1642962902832,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.apimanagement/service/loggers.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT928",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service/loggers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT928",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "existingApiMgmtName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of existing Api Management service. eg: 'blue-api-mgmt-v2'"
+ }
+ },
+ "logToEventhubLoggerName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of log-to-eventhub 'logger-id' referred to in policy xml"
+ }
+ },
+ "eventHubNS": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Eventhub Namespace"
+ }
+ },
+ "eventHubName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Eventhub"
+ }
+ },
+ "eventHubSendPolicyName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Eventhub Send Policy"
+ }
+ },
+ "tags": {
+ "type": "Object"
+ }
+ },
+ "functions": [],
+ "variables": {
+ "credentialsName": "credentials-logToEventhubLoggerName"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service/loggers",
+ "apiVersion": "2020-12-01",
+ "name": "existingApiMgmtName/logToEventhubLoggerName",
+ "tags": "tags",
+ "properties": {
+ "loggerType": "azureEventHub",
+ "description": "This logger logs to event hub",
+ "credentials": {
+ "name": "credentials-logToEventhubLoggerName",
+ "connectionString": "[listKeys(resourceId('Microsoft.EventHub/namespaces/eventhubs/authorizationRules', parameters('eventHubNS'), parameters('eventHubName'), parameters('eventHubSendPolicyName')), '2021-01-01-preview').primaryConnectionString]"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "logToEventhubLoggerName": {
+ "type": "string",
+ "value": "[parameters('logToEventhubLoggerName')]"
+ },
+ "resourceId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.ApiManagement/service/loggers', parameters('existingApiMgmtName'), parameters('logToEventhubLoggerName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT929 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT929
new file mode 100644
index 0000000..1d80cc5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT929
@@ -0,0 +1,187 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.eventhub/namespaces.json"
+ ],
+ "timestamp": 1642962902839,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.eventhub/namespaces.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT929",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.eventhub/namespaces/eventhubs",
+ "microsoft.eventhub/namespaces/eventhubs/authorizationrules",
+ "microsoft.eventhub/namespaces/authorizationrules",
+ "microsoft.eventhub/namespaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT929",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "eventHubNsName": {
+ "type": "String"
+ },
+ "eventHubName": {
+ "type": "String"
+ },
+ "eventHubSendPolicyName": {
+ "type": "String",
+ "defaultValue": "evt-hub-apim-send-policy"
+ },
+ "eventHubListenPolicy": {
+ "type": "String",
+ "defaultValue": "evt-hub-app-consume-policy"
+ },
+ "ehNsSkuName": {
+ "type": "String",
+ "defaultValue": "Standard"
+ },
+ "ehNsSkuTier": {
+ "type": "String",
+ "defaultValue": "Standard"
+ },
+ "ehNsSkuCapacity": {
+ "type": "String",
+ "defaultValue": "1"
+ },
+ "ehNsIsAutoInflateEnabled": {
+ "type": "String",
+ "defaultValue": "false"
+ },
+ "ehNsMaximumThroughputUnits": {
+ "type": "String",
+ "defaultValue": "0"
+ },
+ "ehNsZoneRedundant": {
+ "type": "Bool",
+ "defaultValue": false
+ },
+ "messageRetentionInDays": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "Number of days to retain messages in eventhub"
+ }
+ },
+ "tags": {
+ "type": "Object",
+ "defaultValue": {}
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "ehUniqSvcName": "eventHubNsName/eventHubName",
+ "ehUniqApimSendPolicyName": "eventHubNsName/eventHubName/evt-hub-apim-send-policy",
+ "ehUniqAppListenPolicyName": "eventHubNsName/evt-hub-app-consume-policy"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.EventHub/namespaces",
+ "apiVersion": "2021-01-01-preview",
+ "name": "eventHubNsName",
+ "location": "location",
+ "tags": {},
+ "sku": {
+ "name": "Standard",
+ "tier": "Standard",
+ "capacity": "1"
+ },
+ "properties": {
+ "isAutoInflateEnabled": "false",
+ "maximumThroughputUnits": "0",
+ "zoneRedundant": false
+ }
+ },
+ {
+ "type": "Microsoft.EventHub/namespaces/eventhubs",
+ "apiVersion": "2021-01-01-preview",
+ "name": "eventHubNsName/eventHubName",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.EventHub/namespaces/eventHubNsName"
+ ],
+ "properties": {
+ "messageRetentionInDays": 1,
+ "partitionCount": 2,
+ "status": "Active"
+ }
+ },
+ {
+ "type": "Microsoft.EventHub/namespaces/eventhubs/authorizationRules",
+ "apiVersion": "2021-01-01-preview",
+ "name": "eventHubNsName/eventHubName/evt-hub-apim-send-policy",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.EventHub/namespaces/eventhubs/eventHubNsName/eventHubName"
+ ],
+ "properties": {
+ "rights": [
+ "Send"
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.EventHub/namespaces/authorizationRules",
+ "apiVersion": "2021-01-01-preview",
+ "name": "eventHubNsName/evt-hub-app-consume-policy",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.EventHub/namespaces/eventHubNsName"
+ ],
+ "properties": {
+ "rights": [
+ "Manage",
+ "Listen",
+ "Send"
+ ]
+ }
+ }
+ ],
+ "outputs": {
+ "eventHubNsName": {
+ "type": "string",
+ "value": "[parameters('eventHubNsName')]"
+ },
+ "eventHubName": {
+ "type": "string",
+ "value": "[parameters('eventHubName')]"
+ },
+ "eventHubSendPolicyName": {
+ "type": "string",
+ "value": "[parameters('eventHubSendPolicyName')]"
+ },
+ "eventHubListenPolicy": {
+ "type": "string",
+ "value": "[parameters('eventHubListenPolicy')]"
+ },
+ "eventHubSendResourceId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.EventHub/namespaces/eventhubs/authorizationRules', parameters('eventHubNsName'), parameters('eventHubName'), parameters('eventHubSendPolicyName'))]"
+ },
+ "eventHubListenResourceId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.EventHub/namespaces/authorizationRules', parameters('eventHubNsName'), parameters('eventHubListenPolicy'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT93 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT93
new file mode 100644
index 0000000..b24052e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT93
@@ -0,0 +1,135 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/setup-cloudera.json"
+ ],
+ "timestamp": 1642962885991,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/setup-cloudera.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT93",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT93",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "vmSpec": {
+ "type": "object"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "clusterSpec": {
+ "type": "object"
+ },
+ "fqdn": {
+ "type": "string"
+ },
+ "cmUsername": {
+ "type": "string"
+ },
+ "cmPassword": {
+ "type": "securestring"
+ },
+ "company": {
+ "type": "string"
+ },
+ "emailAddress": {
+ "type": "string"
+ },
+ "businessPhone": {
+ "type": "string"
+ },
+ "firstName": {
+ "type": "string"
+ },
+ "lastName": {
+ "type": "string"
+ },
+ "jobRole": {
+ "type": "string"
+ },
+ "jobFunction": {
+ "type": "string"
+ },
+ "installCDH": {
+ "type": "string"
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "masterIP": "networkSpec",
+ "workerIP": "networkSpec"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "dnsNamePrefix-mn0/prepareDisks",
+ "location": "[resourceGroup().location]",
+ "comments": "Cloudera Setup extensions that run to configure the Cloudera cluster environment",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": [
+ "scriptsUri/scripts/bootstrap-cloudera.sh",
+ "scriptsUri/scripts/initialize-cloudera-server.sh",
+ "scriptsUri/scripts/cmxDeployOnIbiza.py",
+ "scriptsUri/scripts/install-postgresql.sh"
+ ]
+ },
+ "protectedSettings": {
+ "commandToExecute": "sh bootstrap-cloudera.sh \"networkSpec\" \"networkSpec\" \"dnsNamePrefix\" \"fqdn\" clusterSpec clusterSpec \"vmSpec\" \"clusterSpec\" \"vmSpec\" \"cmUsername\" \"cmPassword\" \"emailAddress\" \"businessPhone\" \"firstName\" \"lastName\" \"jobRole\" \"jobFunction\" \"company\" \"installCDH\" \"vmSpec\" >> /home/$ADMINUSER/bootstrap-cloudera.log 2>&1"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT930 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT930
new file mode 100644
index 0000000..7e1e3da
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT930
@@ -0,0 +1,78 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.storage/storageaccounts.json"
+ ],
+ "timestamp": 1642962902846,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.storage/storageaccounts.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT930",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT930",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name for storage account. Max 24 chars. a-z A-Z 0-9 no special characters or spaces. Used in DNS url"
+ }
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS"
+ },
+ "storageKind": {
+ "type": "string",
+ "defaultValue": "StorageV2"
+ },
+ "tags": {
+ "type": "Object"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources. eg 'westus2'"
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2021-02-01",
+ "name": "storageAccountName",
+ "location": "location",
+ "tags": "tags",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ }
+ ],
+ "outputs": {
+ "storageAccountName": {
+ "type": "string",
+ "value": "[parameters('storageAccountName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT931 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT931
new file mode 100644
index 0000000..5bc26af
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT931
@@ -0,0 +1,62 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.web/sites/extensions.json"
+ ],
+ "timestamp": 1642962902851,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.web/sites/extensions.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT931",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT931",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appServiceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Azure App service resource"
+ }
+ },
+ "webJobZipDeployUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "URL to Zip file that contains webjob using format suitable to be published using msdeploy"
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "name": "appServiceName/MSDeploy",
+ "type": "Microsoft.Web/sites/extensions",
+ "properties": {
+ "addOnPackages": [
+ {
+ "packageUri": "webJobZipDeployUrl",
+ "AppOffline": true
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT932 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT932
new file mode 100644
index 0000000..5eb7f98
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT932
@@ -0,0 +1,84 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.web/serverfarms.json"
+ ],
+ "timestamp": 1642962902859,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.web/serverfarms.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT932",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/serverfarms"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT932",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appServicePlanName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name to be given to this new App Service Plan"
+ }
+ },
+ "appServiceSkuName": {
+ "type": "string",
+ "defaultValue": "B1",
+ "allowedValues": [
+ "B1",
+ "B2",
+ "B3",
+ "S1",
+ "S2",
+ "S3",
+ "P1v2",
+ "P2v2",
+ "P3v2",
+ "P1v3",
+ "P2v3",
+ "P3v3"
+ ],
+ "metadata": {
+ "description": "The instance / SKU name for Azure App Service eg: B1, B2, S1, P1V2. Note F1 and D1 shared plan are not supported as they do not support 'alwaysOn'"
+ }
+ },
+ "tags": {
+ "type": "Object"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources. eg 'westus2'"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/serverfarms",
+ "apiVersion": "2020-12-01",
+ "name": "appServicePlanName",
+ "location": "location",
+ "tags": "tags",
+ "sku": {
+ "name": "B1"
+ },
+ "kind": "app"
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT933 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT933
new file mode 100644
index 0000000..6372f45
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT933
@@ -0,0 +1,233 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.web/sites.json"
+ ],
+ "timestamp": 1642962902865,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/nested/microsoft.web/sites.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT933",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites/config",
+ "microsoft.web/sites",
+ "microsoft.web/sites/hostnamebindings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT933",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "appServiceName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name to be given to this new App Service. This value is used in DNS and must be unique."
+ }
+ },
+ "appServicePlanName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of an existing App Service plan for which the App Service will be created"
+ }
+ },
+ "eventHubNamespace": {
+ "type": "string",
+ "metadata": {
+ "description": "sets environment variable APIMEVENTS-EVENTHUB-NAME"
+ }
+ },
+ "eventHubName": {
+ "type": "string",
+ "metadata": {
+ "description": "Sets environment variable APIMEVENTS-EVENTHUB-NAME"
+ }
+ },
+ "eventHubListenPolicy": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of Event Hubs Namespace listen policy. Found in EventHubNamespace/Settings/Shared access policies: eg 'moesiflogaaaaaa-listen-policy'"
+ }
+ },
+ "apimEvtStorName": {
+ "type": "string",
+ "metadata": {
+ "description": "Sets environment variable APIMEVENTS-STORAGEACCOUNT-NAME"
+ }
+ },
+ "apimEvtMoesifApplicationId": {
+ "type": "string",
+ "metadata": {
+ "description": "Sets environment variable APIMEVENTS-MOESIF-APPLICATION-ID"
+ }
+ },
+ "apimEvtMoesifSessionToken": {
+ "type": "string",
+ "defaultValue": "optional",
+ "metadata": {
+ "description": "Sets environment variable APIMEVENTS-MOESIF-SESSION-TOKEN"
+ }
+ },
+ "apimEvtMoesifApiVersion": {
+ "type": "string",
+ "defaultValue": "v1",
+ "metadata": {
+ "description": "Sets environment variable APIMEVENTS-MOESIF-API-VERSION"
+ }
+ },
+ "azureWebsitesDomain": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS name to use for azure webapp such as .azurewebsites.net"
+ }
+ },
+ "tags": {
+ "type": "Object",
+ "defaultValue": {}
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources. eg 'westus2'"
+ }
+ }
+ },
+ "variables": {
+ "appServiceHostName": "appServiceNameazureWebsitesDomain"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2020-12-01",
+ "name": "appServiceName",
+ "location": "location",
+ "tags": {},
+ "kind": "app",
+ "properties": {
+ "enabled": true,
+ "hostNameSslStates": [
+ {
+ "name": "appServiceNameazureWebsitesDomain",
+ "sslState": "Disabled",
+ "hostType": "Standard"
+ },
+ {
+ "name": "appServiceName.scmazureWebsitesDomain",
+ "sslState": "Disabled",
+ "hostType": "Repository"
+ }
+ ],
+ "serverFarmId": "Microsoft.Web/serverfarms/appServicePlanName",
+ "reserved": false,
+ "isXenon": false,
+ "hyperV": false,
+ "siteConfig": {
+ "appSettings": [
+ {
+ "name": "APIMEVENTS-EVENTHUB-CONNECTIONSTRING",
+ "value": "[listKeys(resourceId('Microsoft.EventHub/namespaces/authorizationRules', parameters('eventHubNamespace'), parameters('eventHubListenPolicy')), '2021-01-01-preview').primaryConnectionString]"
+ },
+ {
+ "name": "APIMEVENTS-EVENTHUB-NAME",
+ "value": "eventHubName"
+ },
+ {
+ "name": "APIMEVENTS-STORAGEACCOUNT-NAME",
+ "value": "apimEvtStorName"
+ },
+ {
+ "name": "APIMEVENTS-STORAGEACCOUNT-KEY",
+ "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('apimEvtStorName')), '2021-02-01').keys[0].value]"
+ },
+ {
+ "name": "APIMEVENTS-MOESIF-APPLICATION-ID",
+ "value": "apimEvtMoesifApplicationId"
+ },
+ {
+ "name": "APIMEVENTS-MOESIF-SESSION-TOKEN",
+ "value": "optional"
+ },
+ {
+ "name": "APIMEVENTS-MOESIF-API-VERSION",
+ "value": "v1"
+ }
+ ]
+ },
+ "scmSiteAlsoStopped": false,
+ "clientAffinityEnabled": true,
+ "clientCertEnabled": false,
+ "hostNamesDisabled": false,
+ "containerSize": 0,
+ "dailyMemoryTimeQuota": 0,
+ "httpsOnly": false,
+ "redundancyMode": "None"
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/config",
+ "apiVersion": "2020-12-01",
+ "name": "appServiceName/web",
+ "location": "location",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Web/sites/appServiceName",
+ "Microsoft.Web/sites/hostNameBindings/appServiceName/appServiceNameazureWebsitesDomain"
+ ],
+ "properties": {
+ "netFrameworkVersion": "v5.0",
+ "logsDirectorySizeLimit": 60,
+ "numberOfWorkers": 1,
+ "alwaysOn": "true",
+ "defaultDocuments": [
+ "Default.htm",
+ "Default.html",
+ "Default.asp",
+ "index.htm",
+ "index.html",
+ "iisstart.htm",
+ "default.aspx",
+ "index.php",
+ "hostingstart.html"
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites/hostNameBindings",
+ "apiVersion": "2020-12-01",
+ "name": "appServiceName/appServiceNameazureWebsitesDomain",
+ "location": "location",
+ "tags": {},
+ "dependsOn": [
+ "Microsoft.Web/sites/appServiceName"
+ ],
+ "properties": {
+ "siteName": "appServiceName",
+ "hostNameType": "Verified"
+ }
+ }
+ ],
+ "outputs": {
+ "appServiceName": {
+ "type": "string",
+ "value": "[parameters('appServiceName')]"
+ },
+ "appServiceHostName": {
+ "type": "string",
+ "value": "[variables('appServiceHostName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT934 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT934
new file mode 100644
index 0000000..2673a40
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT934
@@ -0,0 +1,344 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902873,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-logs-to-moesif-using-eventhub-webapp/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT934",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT934",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "moesifApplicationId": {
+ "type": "string",
+ "minLength": 50,
+ "metadata": {
+ "description": "Your Moesif Application Id which can be found within your Moesif Portal. After signing up for a Moesif account, your Moesif Application Id will be displayed during the onboarding steps. Sets environment variable APIMEVENTS-MOESIF-APPLICATION-ID in App Service"
+ },
+ "value": ""
+ },
+ "existingApiMgmtName": {
+ "type": "string",
+ "defaultValue": "",
+ "minLength": 0,
+ "metadata": {
+ "description": "Name of your existing Azure API Management service. If blank, the log-to-eventhub logger is not created. The API Management service must be in same Resource Group as the deployment"
+ }
+ },
+ "azureAppServiceSku": {
+ "type": "string",
+ "defaultValue": "B1",
+ "allowedValues": [
+ "B1",
+ "B2",
+ "B3",
+ "S1",
+ "S2",
+ "S3",
+ "P1v2",
+ "P2v2",
+ "P3v2",
+ "P1v3",
+ "P2v3",
+ "P3v3"
+ ],
+ "metadata": {
+ "description": "The instance / SKU name for Azure App Service eg: B1, B2, S1, P1V2. Note F1 and D1 shared plan are not supported as they do not support 'alwaysOn'"
+ }
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "defaultValue": "[concat('moesiflog', uniqueString(resourceGroup().id))]",
+ "minLength": 6,
+ "metadata": {
+ "description": "A prefix that will be added to created resource names and DNS URLs. Allowed characters: alphabets and numbers only. Resulting name must be maximum 24 characters (storage account maximum)"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources. eg 'westus2'"
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "The base URL where templates are located. Should end with trailing '/'"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "moesifSessionToken": "optional",
+ "moesifApiVersion": "v1",
+ "apiManagementLoggerName": "moesif-log-to-event-hub",
+ "azureWebsitesDomainLookup": {
+ "AzureCloud": ".azurewebsites.net",
+ "AzureUSGovernment": ".azurewebsites.us"
+ },
+ "azureWebsitesDomain": "(azureWebsitesDomainLookup)[environment().name]",
+ "eventHubNS": "[concat('moesiflog', uniqueString(resourceGroup().id))]",
+ "eventHubName": "[concat('moesiflog', uniqueString(resourceGroup().id))]",
+ "eventHubSendPolicyName": "[concat('moesiflog', uniqueString(resourceGroup().id))]-send-policy",
+ "eventHubListenPolicy": "[concat('moesiflog', uniqueString(resourceGroup().id))]-listen-policy",
+ "azStorageTemplUri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.storage/storageaccounts.json', parameters('_artifactsLocationSasToken')))]",
+ "azEventHubTemplUri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.eventhub/namespaces.json', parameters('_artifactsLocationSasToken')))]",
+ "azApiMgmtLoggerInstallTemplUri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.apimanagement/service/loggers.json', parameters('_artifactsLocationSasToken')))]",
+ "azAppServicePlanTemplUri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.web/serverfarms.json', parameters('_artifactsLocationSasToken')))]",
+ "azAppServiceTemplUri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.web/sites.json', parameters('_artifactsLocationSasToken')))]",
+ "azAppServiceWebJobTemplUri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.web/sites/extensions.json', parameters('_artifactsLocationSasToken')))]",
+ "azAppServiceWebJobZipUri": "[uri(parameters('_artifactsLocation'), concat('scripts/apim-2-moesif-webjob-webdeploy.zip', parameters('_artifactsLocationSasToken')))]",
+ "storageAccountName": "[replace(parameters('dnsNamePrefix'), '-', '')]",
+ "apiMgrSpecified": "[greater(length(parameters('existingApiMgmtName')), 0)]",
+ "tags": {
+ "purpose": "moesif"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "storage-deploy",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.storage/storageaccounts.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "storageAccountName": {
+ "value": "[replace(parameters('dnsNamePrefix'), '-', '')]"
+ },
+ "tags": {
+ "value": {
+ "purpose": "moesif"
+ }
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "eventhub-deploy",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.eventhub/namespaces.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "eventHubNsName": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "eventHubName": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "eventHubSendPolicyName": {
+ "value": "[variables('eventHubSendPolicyName')]"
+ },
+ "eventHubListenPolicy": {
+ "value": "[variables('eventHubListenPolicy')]"
+ },
+ "tags": {
+ "value": {
+ "purpose": "moesif"
+ }
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "api-management-logger-deploy",
+ "condition": "[greater(length(parameters('existingApiMgmtName')), 0)]",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/eventhub-deploy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.apimanagement/service/loggers.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "existingApiMgmtName": {
+ "value": ""
+ },
+ "logToEventhubLoggerName": {
+ "value": "moesif-log-to-event-hub"
+ },
+ "eventHubNS": {
+ "value": "[variables('eventHubNS')]"
+ },
+ "eventHubName": {
+ "value": "[variables('eventHubName')]"
+ },
+ "eventHubSendPolicyName": {
+ "value": "[variables('eventHubSendPolicyName')]"
+ },
+ "tags": {
+ "value": {
+ "purpose": "moesif"
+ }
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "app-service-plan-deploy",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.web/serverfarms.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "appServicePlanName": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "appServiceSkuName": {
+ "value": "B1"
+ },
+ "tags": {
+ "value": {
+ "purpose": "moesif"
+ }
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "app-service-deploy",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/app-service-plan-deploy",
+ "Microsoft.Resources/deployments/storage-deploy",
+ "Microsoft.Resources/deployments/eventhub-deploy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.web/sites.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "appServiceName": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "appServicePlanName": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "eventHubNamespace": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "eventHubName": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "eventHubListenPolicy": {
+ "value": "[variables('eventHubListenPolicy')]"
+ },
+ "apimEvtStorName": {
+ "value": "[replace(parameters('dnsNamePrefix'), '-', '')]"
+ },
+ "apimEvtMoesifApplicationId": {
+ "value": ""
+ },
+ "apimEvtMoesifSessionToken": {
+ "value": "optional"
+ },
+ "apimEvtMoesifApiVersion": {
+ "value": "v1"
+ },
+ "azureWebsitesDomain": {
+ "value": "(azureWebsitesDomainLookup)[environment().name]"
+ },
+ "tags": {
+ "value": {
+ "purpose": "moesif"
+ }
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "name": "app-service-webjob-msdeploy",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/app-service-deploy"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/microsoft.web/sites/extensions.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "appServiceName": {
+ "value": "[concat('moesiflog', uniqueString(resourceGroup().id))]"
+ },
+ "webJobZipDeployUrl": {
+ "value": "[uri(parameters('_artifactsLocation'), concat('scripts/apim-2-moesif-webjob-webdeploy.zip', parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "logToEventhubLoggerName": {
+ "type": "string",
+ "condition": "[variables('apiMgrSpecified')]",
+ "value": "[variables('apiManagementLoggerName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT935 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT935
new file mode 100644
index 0000000..7ce315a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT935
@@ -0,0 +1,228 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-private-endpoint/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-private-endpoint/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902889,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-private-endpoint/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-private-endpoint/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT935",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/privatednszones",
+ "microsoft.network/virtualnetworks",
+ "microsoft.apimanagement/service",
+ "microsoft.network/privatednszones/virtualnetworklinks",
+ "microsoft.network/privateendpoints",
+ "microsoft.network/privateendpoints/privatednszonegroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT935",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1124.51302",
+ "templateHash": "12160737428716643043"
+ }
+ },
+ "parameters": {
+ "apiManagementServiceName": {
+ "type": "string",
+ "defaultValue": "[format('apim-privateendpoint-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "The name of the API Management service instance"
+ }
+ },
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Developer",
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "Virtual network name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ },
+ "value": "westcentralus"
+ },
+ "privateEndpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Private endpoint name"
+ },
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "variables": {
+ "subnetName": "default",
+ "privateDNSZoneName": "privatelink.azure-api.net"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "westcentralus",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "172.20.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "default",
+ "properties": {
+ "addressPrefix": "172.20.0.0/24",
+ "privateEndpointNetworkPolicies": "Disabled"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2021-08-01",
+ "name": "[format('apim-privateendpoint-{0}', uniqueString(resourceGroup().id))]",
+ "location": "westcentralus",
+ "sku": {
+ "name": "Standard",
+ "capacity": 1
+ },
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "GEN-UNIQUE"
+ }
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints",
+ "apiVersion": "2020-07-01",
+ "name": "GEN-UNIQUE",
+ "location": "westcentralus",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/VirtualNetworks/subnets/GEN-UNIQUE/default"
+ },
+ "privateLinkServiceConnections": [
+ {
+ "name": "MyConnection",
+ "properties": {
+ "privateLinkServiceId": "Microsoft.ApiManagement/service/[format('apim-privateendpoint-{0}', uniqueString(resourceGroup().id))]",
+ "groupIds": [
+ "Gateway"
+ ]
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.ApiManagement/service/[format('apim-privateendpoint-{0}', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones",
+ "apiVersion": "2020-06-01",
+ "name": "privatelink.azure-api.net",
+ "location": "global",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
+ "apiVersion": "2020-06-01",
+ "name": "[format('{0}/{1}', variables('privateDNSZoneName'), format('{0}-link', variables('privateDNSZoneName')))]",
+ "location": "global",
+ "properties": {
+ "registrationEnabled": false,
+ "virtualNetwork": {
+ "id": "Microsoft.Network/virtualNetworks/GEN-UNIQUE"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.azure-api.net",
+ "Microsoft.Network/virtualNetworks/GEN-UNIQUE"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
+ "apiVersion": "2020-08-01",
+ "name": "[format('{0}/{1}', parameters('privateEndpointName'), 'dnsgroupname')]",
+ "properties": {
+ "privateDnsZoneConfigs": [
+ {
+ "name": "config1",
+ "properties": {
+ "privateDnsZoneId": "Microsoft.Network/privateDnsZones/privatelink.azure-api.net"
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/privateDnsZones/privatelink.azure-api.net",
+ "Microsoft.Network/privateEndpoints/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT936 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT936
new file mode 100644
index 0000000..06709d7
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT936
@@ -0,0 +1,124 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-simple-zones/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-simple-zones/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902898,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/api-management-simple-zones/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/api-management-simple-zones/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT936",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT936",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "10578356438771699579"
+ }
+ },
+ "parameters": {
+ "apiManagementServiceName": {
+ "type": "string",
+ "defaultValue": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "The name of the API Management service instance"
+ }
+ },
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Premium",
+ "allowedValues": [
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ },
+ "value": "FranceCentral"
+ },
+ "availabilityZones": {
+ "type": "array",
+ "defaultValue": [
+ "1",
+ "2",
+ "3"
+ ],
+ "metadata": {
+ "description": "Zone numbers e.g. 1,2,3."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2021-01-01-preview",
+ "name": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "location": "FranceCentral",
+ "zones": "[if(equals(length(parameters('availabilityZones')), 0), json('null'), parameters('availabilityZones'))]",
+ "sku": {
+ "name": "Premium",
+ "capacity": 3
+ },
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "GEN-UNIQUE"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT937 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT937
new file mode 100644
index 0000000..448090c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT937
@@ -0,0 +1,114 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/azure-api-management-create/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/azure-api-management-create/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902915,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.apimanagement/azure-api-management-create/azuredeploy.json",
+ "/quickstarts/microsoft.apimanagement/azure-api-management-create/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT937",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.apimanagement/service"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT937",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "10451446506799526629"
+ }
+ },
+ "parameters": {
+ "apiManagementServiceName": {
+ "type": "string",
+ "defaultValue": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "The name of the API Management service instance"
+ }
+ },
+ "publisherEmail": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The email address of the owner of the service"
+ },
+ "value": "email@example.com"
+ },
+ "publisherName": {
+ "type": "string",
+ "minLength": 1,
+ "metadata": {
+ "description": "The name of the owner of the service"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Developer",
+ "allowedValues": [
+ "Developer",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "The pricing tier of this API Management service"
+ }
+ },
+ "skuCount": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 1,
+ 2
+ ],
+ "metadata": {
+ "description": "The instance size of this API Management service."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.ApiManagement/service",
+ "apiVersion": "2020-12-01",
+ "name": "[format('apiservice{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Developer",
+ "capacity": 1
+ },
+ "properties": {
+ "publisherEmail": "email@example.com",
+ "publisherName": "GEN-UNIQUE"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT938 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT938
new file mode 100644
index 0000000..402faaa
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT938
@@ -0,0 +1,259 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902924,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT938",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT938",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specify the locations for all resources."
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the virtual machine admin user name."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Specify the virtual machine admin password."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "domainNameLabel": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the DNS label for the virtual machine public IP address. It must be lowercase. It should match the following regular expression, or it will raise an error: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Specify the size of the VM."
+ }
+ },
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the storage account name."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "appConfigStoreResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the resource group for the app config store."
+ },
+ "value": "GEN-APPCONFIGSTORE-RESOURCEGROUP-NAME"
+ },
+ "appConfigStoreName": {
+ "type": "string",
+ "metadata": {
+ "description": "App configuration store name."
+ },
+ "value": "GEN-APPCONFIGSTORE-NAME"
+ },
+ "vmSkuKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of the key in the app config store for the VM windows sku."
+ },
+ "value": "GEN-APPCONFIGSTORE-WINDOWSOSVERSION"
+ },
+ "diskSizeKey": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of the key in the app config store for the VM disk size"
+ },
+ "value": "GEN-APPCONFIGSTORE-DISKSIZEGB"
+ }
+ },
+ "variables": {
+ "nicName": "myVMNic",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressName": "myPublicIP",
+ "vmName": "SimpleWinVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet",
+ "appConfigRef": "GEN-APPCONFIGSTORE-RESOURCEGROUP-NAME/Microsoft.AppConfiguration/configurationStores/GEN-APPCONFIGSTORE-NAME",
+ "windowsOSVersionParameters": {
+ "key": "GEN-APPCONFIGSTORE-WINDOWSOSVERSION",
+ "label": "template"
+ },
+ "diskSizeGBParameters": {
+ "key": "GEN-APPCONFIGSTORE-DISKSIZEGB",
+ "label": "template"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2019-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-05-01",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-05-01",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-05-01",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP",
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2019-12-01",
+ "name": "SimpleWinVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE",
+ "Microsoft.Network/networkInterfaces//myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "SimpleWinVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "[listKeyValue(variables('appConfigRef'), '2019-10-01', variables('windowsOSVersionParameters')).value]",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": "[listKeyValue(variables('appConfigRef'), '2019-10-01', variables('diskSizeGBParameters')).value]",
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))).primaryEndpoints.blob]"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "hostname": {
+ "type": "string",
+ "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT939 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT939
new file mode 100644
index 0000000..e507e90
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT939
@@ -0,0 +1,69 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902933,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT939",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.appconfiguration/configurationstores"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT939",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "configStoreName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the app configuration store."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the Azure location where the app configuration store should be created."
+ }
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "standard",
+ "metadata": {
+ "description": "Specifies the SKU of the app configuration store."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores",
+ "apiVersion": "2019-10-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "standard"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT94 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT94
new file mode 100644
index 0000000..6531b23
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT94
@@ -0,0 +1,327 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/shared-resources-existing-vnet.json"
+ ],
+ "timestamp": 1642962886016,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/shared-resources-existing-vnet.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT94",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/availabilitysets",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT94",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "masterNodeASName": {
+ "type": "string"
+ },
+ "dataNodeASName": {
+ "type": "string"
+ },
+ "tableauASName": {
+ "type": "string"
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "masterNodeASName",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node Name",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "dataNodeASName",
+ "location": "[resourceGroup().location]",
+ "comments": "Data Node Name",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "tableauASName",
+ "location": "[resourceGroup().location]",
+ "comments": "Tableau Server Name",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "tableauTags"
+ },
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "networkSpec-sg",
+ "location": "[resourceGroup().location]",
+ "comments": "Shared Resources Network Security Group Rules",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.Web.UI",
+ "properties": {
+ "description": "Allows HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50070",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hiveserver2",
+ "properties": {
+ "description": "Allows Hiveserver traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 102,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hive.Metastore",
+ "properties": {
+ "description": "Allows Hive Metastore traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "9083",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 103,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hue",
+ "properties": {
+ "description": "Allows Hue traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 104,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.ResourceManager",
+ "properties": {
+ "description": "Allows YARN Resource Manager traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8088",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 105,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.JobHistory.Server",
+ "properties": {
+ "description": "Allows YARN JobHistory Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "19888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 106,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Oozie.Server",
+ "properties": {
+ "description": "Allows Oozie Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "11000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 107,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management.Web.UI",
+ "properties": {
+ "description": "Allows Management.Web.UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7180",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 108,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Navigator",
+ "properties": {
+ "description": "Allows Navigator traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7187",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 109,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.dn.Web.UI",
+ "properties": {
+ "description": "Allow HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50075",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.nm.Web.UI",
+ "properties": {
+ "description": "Allow YARN Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8042",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 111,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.JDBC",
+ "properties": {
+ "description": "Allow Impala JDBC traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 112,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.Shell",
+ "properties": {
+ "description": "Allow Impala Shell traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 113,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http",
+ "properties": {
+ "description": "Allows http traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 115,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT940 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT940
new file mode 100644
index 0000000..bf5c08c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT940
@@ -0,0 +1,98 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-ff/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-ff/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902942,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-ff/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-ff/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT940",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.appconfiguration/configurationstores"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT940",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "configStoreName": {
+ "type": "string",
+ "defaultValue": "[concat('appconfig',uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the App Configuration store."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the Azure location where the app configuration store should be created."
+ }
+ },
+ "featureFlagKey": {
+ "type": "string",
+ "defaultValue": "FeatureFlagSample",
+ "metadata": {
+ "description": "Specifies the key of the feature flag."
+ }
+ },
+ "featureFlagLabel": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Specifies the label of the feature flag. The label is optional and can be left as empty."
+ }
+ }
+ },
+ "variables": {
+ "featureFlagValue": {
+ "id": "FeatureFlagSample",
+ "description": "Your description.",
+ "enabled": true
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores",
+ "apiVersion": "2020-07-01-preview",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "standard"
+ },
+ "resources": [
+ {
+ "type": "keyValues",
+ "apiVersion": "2020-07-01-preview",
+ "name": ".appconfig.featureflag~2FFeatureFlagSample$ parameters('featureFlagLabel')",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "[string(variables('featureFlagValue'))]",
+ "contentType": "application/vnd.microsoft.appconfig.ff+json;charset=utf-8"
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT941 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT941
new file mode 100644
index 0000000..95b8096
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT941
@@ -0,0 +1,96 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-keyvaultref/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-keyvaultref/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902950,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-keyvaultref/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-keyvaultref/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT941",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.appconfiguration/configurationstores"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT941",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "configStoreName": {
+ "type": "string",
+ "defaultValue": "[concat('appconfig',uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specifies the name of the App Configuration store."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the Azure location where the app configuration store should be created."
+ }
+ },
+ "keyValueName": {
+ "type": "string",
+ "defaultValue": "KeyVaultReferenceSample",
+ "metadata": {
+ "description": "Specifies the name of the key-value resource. The name is a combination of key and label with $ as delimiter."
+ }
+ },
+ "keyVaultSecretURL": {
+ "type": "string",
+ "metadata": {
+ "description": "Format should be https://{vault-name}.{vault-DNS-suffix}/secrets/{secret-name}/{secret-version}. Secret version is optional."
+ },
+ "value": "GEN-KEYVAULT-ENCRYPTION-KEY-URI"
+ }
+ },
+ "variables": {
+ "keyVaultRef": {
+ "uri": "GEN-KEYVAULT-ENCRYPTION-KEY-URI"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores",
+ "apiVersion": "2020-07-01-preview",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "standard"
+ },
+ "resources": [
+ {
+ "type": "keyValues",
+ "apiVersion": "2020-07-01-preview",
+ "name": "KeyVaultReferenceSample",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "[string(variables('keyVaultRef'))]",
+ "contentType": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8"
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT942 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT942
new file mode 100644
index 0000000..64f7c8c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT942
@@ -0,0 +1,142 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902959,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT942",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.appconfiguration/configurationstores/keyvalues",
+ "microsoft.appconfiguration/configurationstores"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT942",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "configStoreName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the App Configuration store."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the Azure location where the app configuration store should be created."
+ }
+ },
+ "keyValueNames": {
+ "type": "array",
+ "defaultValue": [
+ "myKey",
+ "myKey$myLabel"
+ ],
+ "metadata": {
+ "description": "Specifies the names of the key-value resources. The name is a combination of key and label with $ as delimiter. The label is optional."
+ }
+ },
+ "keyValueValues": {
+ "type": "array",
+ "defaultValue": [
+ "Key-value without label",
+ "Key-value with label"
+ ],
+ "metadata": {
+ "description": "Specifies the values of the key-value resources. It's optional"
+ }
+ },
+ "contentType": {
+ "type": "string",
+ "defaultValue": "the-content-type",
+ "metadata": {
+ "description": "Specifies the content type of the key-value resources. For feature flag, the value should be application/vnd.microsoft.appconfig.ff+json;charset=utf-8. For Key Value reference, the value should be application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8. Otherwise, it's optional."
+ }
+ },
+ "tags": {
+ "type": "object",
+ "defaultValue": {
+ "tag1": "tag-value-1",
+ "tag2": "tag-value-2"
+ },
+ "metadata": {
+ "description": "Adds tags for the key-value resources. It's optional"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores",
+ "apiVersion": "2020-07-01-preview",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "standard"
+ }
+ },
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores/keyValues",
+ "apiVersion": "2020-07-01-preview",
+ "name": "[concat(parameters('configStoreName'), '/', parameters('keyValueNames')[copyIndex()])]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "keyValueValues)[copyIndex(",
+ "contentType": "the-content-type",
+ "tags": {
+ "tag1": "tag-value-1",
+ "tag2": "tag-value-2"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores/keyValues",
+ "apiVersion": "2020-07-01-preview",
+ "name": "[concat(parameters('configStoreName'), '/', parameters('keyValueNames')[copyIndex()])]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "keyValueValues)[copyIndex(",
+ "contentType": "the-content-type",
+ "tags": {
+ "tag1": "tag-value-1",
+ "tag2": "tag-value-2"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "reference-key-value-value": {
+ "value": "[reference(resourceId('Microsoft.AppConfiguration/configurationStores/keyValues', parameters('configStoreName'), parameters('keyValueNames')[0]), '2020-07-01-preview').value]",
+ "type": "string"
+ },
+ "reference-key-value-object": {
+ "value": "[reference(resourceId('Microsoft.AppConfiguration/configurationStores/keyValues', parameters('configStoreName'), parameters('keyValueNames')[1]), '2020-07-01-preview')]",
+ "type": "object"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT943 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT943
new file mode 100644
index 0000000..ef4464f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT943
@@ -0,0 +1,149 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv-copy/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv-copy/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902967,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv-copy/azuredeploy.json",
+ "/quickstarts/microsoft.appconfiguration/app-configuration-store-kv-copy/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT943",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.appconfiguration/configurationstores/keyvalues",
+ "microsoft.appconfiguration/configurationstores"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT943",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "configStoreName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the name of the App Configuration store."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the Azure location where the app configuration store should be created."
+ }
+ },
+ "keyData": {
+ "type": "array",
+ "defaultValue": [
+ {
+ "key": "key01_name",
+ "value": "key01_value",
+ "tag": {
+ "tag01_name": "tag01_value",
+ "tag02_name": "tag02_value"
+ },
+ "contentType": "key01_contentType"
+ },
+ {
+ "key": "key02_name",
+ "value": "key02_value",
+ "label": "key02_label01",
+ "tag": {
+ "tag01_name": "tag01_value",
+ "tag02_name": "tag02_value"
+ },
+ "contentType": "key02_contentType"
+ },
+ {
+ "key": "key02_name",
+ "value": "key02_value",
+ "label": "key02_label02",
+ "tag": {
+ "tag01_name": "tag01_value",
+ "tag02_name": "tag02_value"
+ },
+ "contentType": "key02_contentType"
+ }
+ ],
+ "metadata": {
+ "description": "Array of Objects that contain the key name, value, tag and contentType"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores",
+ "apiVersion": "2020-07-01-preview",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "standard"
+ }
+ },
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores/keyValues",
+ "apiVersion": "2020-07-01-preview",
+ "name": "(parameters(configStoreName), /, if(contains(parameters(keyData)[copyIndex()], label), format({0}${1}, parameters(keyData)[copyIndex()].key, parameters(keyData)[copyIndex()].label), parameters(keyData)[copyIndex()].key))",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "keyData)[copyIndex(",
+ "contentType": "[if(contains(parameters('keyData')[copyIndex()], 'contentType'), parameters('keyData')[copyIndex()].contentType, json('null'))]",
+ "tags": "[if(contains(parameters('keyData')[copyIndex()], 'tag'), parameters('keyData')[copyIndex()].tag, json('null'))]"
+ }
+ },
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores/keyValues",
+ "apiVersion": "2020-07-01-preview",
+ "name": "(parameters(configStoreName), /, if(contains(parameters(keyData)[copyIndex()], label), format({0}${1}, parameters(keyData)[copyIndex()].key, parameters(keyData)[copyIndex()].label), parameters(keyData)[copyIndex()].key))",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "keyData)[copyIndex(",
+ "contentType": "[if(contains(parameters('keyData')[copyIndex()], 'contentType'), parameters('keyData')[copyIndex()].contentType, json('null'))]",
+ "tags": "[if(contains(parameters('keyData')[copyIndex()], 'tag'), parameters('keyData')[copyIndex()].tag, json('null'))]"
+ }
+ },
+ {
+ "type": "Microsoft.AppConfiguration/configurationStores/keyValues",
+ "apiVersion": "2020-07-01-preview",
+ "name": "(parameters(configStoreName), /, if(contains(parameters(keyData)[copyIndex()], label), format({0}${1}, parameters(keyData)[copyIndex()].key, parameters(keyData)[copyIndex()].label), parameters(keyData)[copyIndex()].key))",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "value": "keyData)[copyIndex(",
+ "contentType": "[if(contains(parameters('keyData')[copyIndex()], 'contentType'), parameters('keyData')[copyIndex()].contentType, json('null'))]",
+ "tags": "[if(contains(parameters('keyData')[copyIndex()], 'tag'), parameters('keyData')[copyIndex()].tag, json('null'))]"
+ }
+ }
+ ],
+ "outputs": {
+ "reference-key-value-value": {
+ "value": "[reference(resourceId('Microsoft.AppConfiguration/configurationStores/keyValues', parameters('configStoreName'), parameters('keyData')[0].key), '2020-07-01-preview').value]",
+ "type": "string"
+ },
+ "reference-key-value-object": {
+ "value": "[reference(resourceId('Microsoft.AppConfiguration/configurationStores/keyValues', parameters('configStoreName'), parameters('keyData')[0].key), '2020-07-01-preview')]",
+ "type": "object"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT944 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT944
new file mode 100644
index 0000000..e7f0284
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT944
@@ -0,0 +1,223 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.appplatform/azure-spring-cloud/azuredeploy.json",
+ "/quickstarts/microsoft.appplatform/azure-spring-cloud/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902982,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.appplatform/azure-spring-cloud/azuredeploy.json",
+ "/quickstarts/microsoft.appplatform/azure-spring-cloud/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT944",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments",
+ "microsoft.appplatform/spring"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT944",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "serviceName": {
+ "type": "string",
+ "value": "GEN-UNIQUE"
+ },
+ "app1": {
+ "type": "string",
+ "defaultValue": "gateway"
+ },
+ "app2": {
+ "type": "string",
+ "defaultValue": "account-service"
+ },
+ "app3": {
+ "type": "string",
+ "defaultValue": "auth-service"
+ },
+ "location": {
+ "type": "string",
+ "allowedValues": [
+ "westeurope",
+ "eastus",
+ "westus2",
+ "southeastasia",
+ "centralus",
+ "australiaeast",
+ "uksouth",
+ "northeurope",
+ "southcentralus",
+ "eastus2"
+ ],
+ "value": "westus2"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.AppPlatform/Spring",
+ "apiVersion": "2020-07-01",
+ "name": "GEN-UNIQUE",
+ "location": "westus2",
+ "sku": {
+ "name": "S0",
+ "tier": "Standard"
+ },
+ "properties": {
+ "configServerProperties": {
+ "configServer": {
+ "gitProperty": {
+ "uri": "https://github.com/Azure-Samples/piggymetrics-config"
+ }
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "apps",
+ "apiVersion": "2020-07-01",
+ "name": "gateway",
+ "properties": {
+ "public": true
+ },
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "resources": [
+ {
+ "type": "deployments",
+ "apiVersion": "2020-07-01",
+ "name": "default",
+ "dependsOn": [
+ "gateway"
+ ],
+ "properties": {
+ "source": {
+ "relativePath": "",
+ "type": "Jar"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "apps",
+ "apiVersion": "2020-07-01",
+ "name": "account-service",
+ "properties": {
+ "public": true
+ },
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "resources": [
+ {
+ "type": "deployments",
+ "apiVersion": "2020-07-01",
+ "name": "default",
+ "dependsOn": [
+ "account-service"
+ ],
+ "properties": {
+ "source": {
+ "relativePath": "",
+ "type": "Jar"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "apps",
+ "apiVersion": "2020-07-01",
+ "name": "auth-service",
+ "properties": {
+ "public": false
+ },
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "resources": [
+ {
+ "type": "deployments",
+ "apiVersion": "2020-07-01",
+ "name": "default",
+ "dependsOn": [
+ "auth-service"
+ ],
+ "properties": {
+ "source": {
+ "relativePath": "",
+ "type": "Jar"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-07-01",
+ "name": "setActiveDeployment",
+ "dependsOn": [
+ "Microsoft.AppPlatform/Spring/apps/deployments/GEN-UNIQUE/gateway/default",
+ "Microsoft.AppPlatform/Spring/apps/deployments/GEN-UNIQUE/account-service/default",
+ "Microsoft.AppPlatform/Spring/apps/deployments/GEN-UNIQUE/auth-service/default"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {},
+ "template": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {},
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.AppPlatform/Spring/apps",
+ "apiVersion": "2020-07-01",
+ "name": "GEN-UNIQUE/gateway",
+ "properties": {
+ "public": true,
+ "activeDeploymentName": "default"
+ }
+ },
+ {
+ "type": "Microsoft.AppPlatform/Spring/apps",
+ "apiVersion": "2020-07-01",
+ "name": "GEN-UNIQUE/account-service",
+ "properties": {
+ "public": false,
+ "activeDeploymentName": "default"
+ }
+ },
+ {
+ "type": "Microsoft.AppPlatform/Spring/apps",
+ "apiVersion": "2020-07-01",
+ "name": "GEN-UNIQUE/auth-service",
+ "properties": {
+ "public": false,
+ "activeDeploymentName": "default"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT945 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT945
new file mode 100644
index 0000000..610aebf
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT945
@@ -0,0 +1,86 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.attestation/attestation-provider-create/azuredeploy.json",
+ "/quickstarts/microsoft.attestation/attestation-provider-create/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962902994,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.attestation/attestation-provider-create/azuredeploy.json",
+ "/quickstarts/microsoft.attestation/attestation-provider-create/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT945",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.attestation/attestationproviders"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT945",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "attestationProviderName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the Attestation provider. Must be between 3 and 24 characters in length and use numbers and lower-case letters only."
+ },
+ "defaultValue": "[uniqueString(resourceGroup().name, deployment().name)]",
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ },
+ "value": "Central US"
+ },
+ "tags": {
+ "type": "object",
+ "defaultValue": {}
+ },
+ "policySigningCertificates": {
+ "type": "string",
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "PolicySigningCertificates": {
+ "PolicySigningCertificates": {
+ "keys": [
+ {
+ "kty": "RSA",
+ "use": "sig",
+ "x5c": [
+ ""
+ ]
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Attestation/attestationProviders",
+ "apiVersion": "2020-10-01",
+ "name": "GEN-UNIQUE",
+ "location": "Central US",
+ "tags": {},
+ "properties": "[if(empty(parameters('policySigningCertificates')), json('{}'), variables('PolicySigningCertificates'))]"
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT946 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT946
new file mode 100644
index 0000000..9f60508
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT946
@@ -0,0 +1,62 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.authorization/azurepolicy-assign-builtinpolicy-resourcegroup/azuredeploy.json",
+ "/quickstarts/microsoft.authorization/azurepolicy-assign-builtinpolicy-resourcegroup/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903003,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.authorization/azurepolicy-assign-builtinpolicy-resourcegroup/azuredeploy.json",
+ "/quickstarts/microsoft.authorization/azurepolicy-assign-builtinpolicy-resourcegroup/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT946",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.authorization/policyassignments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT946",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "policyAssignmentName": {
+ "type": "string",
+ "defaultValue": "[guid(parameters('policyDefinitionID'), resourceGroup().name)]",
+ "metadata": {
+ "description": "Specifies the name of the policy assignment, can be used defined or an idempotent name as the defaultValue provides."
+ }
+ },
+ "policyDefinitionID": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the ID of the policy definition or policy set definition being assigned."
+ },
+ "value": "/providers/Microsoft.Authorization/policyDefinitions/0a914e76-4921-4c19-b460-a2d36003525a"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Authorization/policyAssignments",
+ "name": "[guid(parameters('policyDefinitionID'), resourceGroup().name)]",
+ "apiVersion": "2019-09-01",
+ "properties": {
+ "scope": "[subscriptionResourceId('Microsoft.Resources/resourceGroups', resourceGroup().name)]",
+ "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/0a914e76-4921-4c19-b460-a2d36003525a"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT947 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT947
new file mode 100644
index 0000000..2c61f50
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT947
@@ -0,0 +1,235 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-multiplevms/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-multiplevms/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903019,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-multiplevms/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-multiplevms/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT947",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT947",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "vmCount": {
+ "type": "int",
+ "defaultValue": 2
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmName": {
+ "type": "array",
+ "metadata": {
+ "description": "VM names."
+ },
+ "value": [
+ "vmName",
+ "vmName1"
+ ]
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1_v2",
+ "metadata": {
+ "description": "description"
+ }
+ }
+ },
+ "variables": {
+ "subnetName": "Subnet",
+ "vmName": [
+ "vmName",
+ "vmName1"
+ ],
+ "virtualNetworkName": "MyVNET",
+ "networkSecurityGroupName": "NSG",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets//MyVNET/Subnet",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-05-01",
+ "name": "NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "[concat(parameters('vmName')[copyIndex()], '-nic')]",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "netLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmName)[copyIndex(",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "vmLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "[resourceId('Microsoft.Network/networkInterfaces/',concat(parameters('vmName')[copyIndex()], '-nic'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1_v2"
+ },
+ "osProfile": {
+ "computerName": "vmName)[copyIndex(",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": "1023",
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(parameters('vmName')[copyIndex()], '-nic'))]"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "virtualMachineName1": {
+ "type": "string",
+ "value": "[variables('vmName')[0]]"
+ },
+ "virtualMachineName2": {
+ "type": "string",
+ "value": "[variables('vmName')[1]]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT948 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT948
new file mode 100644
index 0000000..6abf07e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT948
@@ -0,0 +1,66 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-resourcegroup/azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-resourcegroup/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903031,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-resourcegroup/azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-resourcegroup/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT948",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.authorization/roleassignments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT948",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "roleDefinitionID": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the role definition ID used in the role assignment."
+ },
+ "value": "acdd72a7-3385-48ef-bd42-f606fba81ae7"
+ },
+ "principalId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specifies the principal ID assigned to the role."
+ },
+ "value": "GEN-AZUREAD-OBJECTID"
+ }
+ },
+ "variables": {
+ "roleAssignmentName": "[guid(parameters('principalId'), parameters('roleDefinitionID'), resourceGroup().id)]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Authorization/roleAssignments",
+ "apiVersion": "2020-04-01-preview",
+ "name": "[guid(parameters('principalId'), parameters('roleDefinitionID'), resourceGroup().id)]",
+ "properties": {
+ "roleDefinitionId": "Microsoft.Authorization/roleDefinitions/roleDefinitionId",
+ "principalId": "GEN-AZUREAD-OBJECTID",
+ "scope": "[resourceGroup().id]"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT949 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT949
new file mode 100644
index 0000000..e835f67
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT949
@@ -0,0 +1,208 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-virtualmachine/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-virtualmachine/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903049,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-virtualmachine/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-builtinrole-virtualmachine/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT949",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT949",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1_v2",
+ "metadata": {
+ "description": "description"
+ }
+ }
+ },
+ "variables": {
+ "nicName": "myVMNic",
+ "subnetName": "Subnet",
+ "vmName": "MyUbuntuVM",
+ "virtualNetworkName": "MyVNET",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets//MyVNET/Subnet",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "networkSecurityGroupName": "Subnet-nsg"
+ },
+ "resources": [
+ {
+ "comments": "Simple Network Security Group for subnet [variables('subnetName')]",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-05-01",
+ "name": "Subnet-nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "MyVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/Subnet-nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/Subnet-nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "myVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//MyVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets//MyVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MyUbuntuVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//myVMNic"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_A1_v2"
+ },
+ "osProfile": {
+ "computerName": "MyUbuntuVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": "1023",
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/myVMNic"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "virtualMachineName": {
+ "type": "string",
+ "value": "[variables('vmName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT95 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT95
new file mode 100644
index 0000000..3d7306b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT95
@@ -0,0 +1,400 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/shared-resources-new-vnet.json"
+ ],
+ "timestamp": 1642962886025,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/shared-resources-new-vnet.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT95",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.compute/availabilitysets",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT95",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "masterNodeASName": {
+ "type": "string"
+ },
+ "dataNodeASName": {
+ "type": "string"
+ },
+ "tableauASName": {
+ "type": "string"
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "masterNodeASName",
+ "location": "[resourceGroup().location]",
+ "comments": "Master Node Name",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "dataNodeASName",
+ "location": "[resourceGroup().location]",
+ "comments": "Data Node Name",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "tableauASName",
+ "location": "[resourceGroup().location]",
+ "comments": "Tableau Server Name",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "tableauTags"
+ },
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "networkSpec-sg",
+ "location": "[resourceGroup().location]",
+ "comments": "Provides Network Security Group rules",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.Web.UI",
+ "properties": {
+ "description": "Allows HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50070",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 101,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hiveserver2",
+ "properties": {
+ "description": "Allows Hiveserver traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "10000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 102,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hive.Metastore",
+ "properties": {
+ "description": "Allows Hive Metastore traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "9083",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 103,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Hue",
+ "properties": {
+ "description": "Allows Hue traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 104,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.ResourceManager",
+ "properties": {
+ "description": "Allows YARN Resource Manager traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8088",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 105,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.JobHistory.Server",
+ "properties": {
+ "description": "Allows YARN JobHistory Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "19888",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 106,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Oozie.Server",
+ "properties": {
+ "description": "Allows Oozie Server traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "11000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 107,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Management.Web.UI",
+ "properties": {
+ "description": "Allows Management.Web.UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7180",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 108,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Navigator",
+ "properties": {
+ "description": "Allows Navigator traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "7187",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 109,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "HDFS.dn.Web.UI",
+ "properties": {
+ "description": "Allow HDFS Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "50075",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 110,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "YARN.nm.Web.UI",
+ "properties": {
+ "description": "Allow YARN Web UI traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "8042",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 111,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.JDBC",
+ "properties": {
+ "description": "Allow Impala JDBC traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21050",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 112,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "Impala.Shell",
+ "properties": {
+ "description": "Allow Impala Shell traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "21000",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 113,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "RDP",
+ "properties": {
+ "description": "Allow RDP Traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "3389",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 114,
+ "direction": "Inbound"
+ }
+ },
+ {
+ "name": "http",
+ "properties": {
+ "description": "Allows http traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "80",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 115,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "networkSpec",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/networkSpec-sg"
+ ],
+ "location": "[resourceGroup().location]",
+ "comments": "Shared Resources Virtual Network configuration",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "networkSpec"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "networkSpec",
+ "properties": {
+ "addressPrefix": "networkSpec",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/networkSpec-sg"
+ }
+ }
+ },
+ {
+ "name": "networkSpec",
+ "properties": {
+ "addressPrefix": "networkSpec",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/networkSpec-sg"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT950 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT950
new file mode 100644
index 0000000..1e6d0a9
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT950
@@ -0,0 +1,101 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-managedidentity-maps/azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-managedidentity-maps/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903055,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.authorization/rbac-managedidentity-maps/azuredeploy.json",
+ "/quickstarts/microsoft.authorization/rbac-managedidentity-maps/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT950",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.maps/accounts",
+ "microsoft.managedidentity/userassignedidentities",
+ "microsoft.maps/accounts/providers/roleassignments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT950",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "location for the the resources to deploy."
+ }
+ },
+ "userAssignedIdentityName": {
+ "type": "string",
+ "metadata": {
+ "description": "the name of the Managed Identity resource."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "mapsAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "the name of the Azure Map Account"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "guid": {
+ "type": "string",
+ "defaultValue": "[guid(resourceGroup().id)]",
+ "metadata": {
+ "description": "Input string for new GUID associated with assigning built in role types"
+ }
+ }
+ },
+ "variables": {
+ "Azure Maps Data Reader": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '423170ca-a8f6-4b0f-8487-9e4eb8f49bfa')]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2018-11-30",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "apiVersion": "2018-05-01",
+ "name": "GEN-UNIQUE-10",
+ "location": "global",
+ "type": "Microsoft.Maps/accounts",
+ "sku": {
+ "name": "S0"
+ }
+ },
+ {
+ "apiVersion": "2018-09-01-preview",
+ "name": "GEN-UNIQUE-10/Microsoft.Authorization/[guid(resourceGroup().id)]",
+ "type": "Microsoft.Maps/accounts/providers/roleAssignments",
+ "dependsOn": [
+ "GEN-UNIQUE-10",
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '423170ca-a8f6-4b0f-8487-9e4eb8f49bfa')]",
+ "principalId": "[reference(parameters('userAssignedIdentityName')).principalId]",
+ "principalType": "ServicePrincipal"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT951 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT951
new file mode 100644
index 0000000..3415418
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT951
@@ -0,0 +1,229 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.json",
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903065,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.json",
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT951",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/linkedservices",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT951",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Workspace name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "pergb2018",
+ "allowedValues": [
+ "pergb2018",
+ "Free",
+ "Standalone",
+ "PerNode",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Pricing tier: perGB2018 or legacy tiers (Free, Standalone, PerNode, Standard or Premium), which are not available to all customers."
+ }
+ },
+ "dataRetention": {
+ "type": "int",
+ "defaultValue": 30,
+ "minValue": 7,
+ "maxValue": 730,
+ "metadata": {
+ "description": "Number of days to retain data."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location in which to create the workspace."
+ }
+ },
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Automation account name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sampleGraphicalRunbookName": {
+ "type": "String",
+ "defaultValue": "AzureAutomationTutorial"
+ },
+ "sampleGraphicalRunbookDescription": {
+ "type": "String",
+ "defaultValue": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal)."
+ },
+ "samplePowerShellRunbookName": {
+ "type": "String",
+ "defaultValue": "AzureAutomationTutorialScript"
+ },
+ "samplePowerShellRunbookDescription": {
+ "type": "String",
+ "defaultValue": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal)."
+ },
+ "samplePython2RunbookName": {
+ "type": "String",
+ "defaultValue": "AzureAutomationTutorialPython2"
+ },
+ "samplePython2RunbookDescription": {
+ "type": "String",
+ "defaultValue": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal)."
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "URI to artifacts location"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ },
+ "retentionInDays": 30,
+ "features": {
+ "searchVersion": 1,
+ "legacy": 0
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2020-01-13-preview",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "name": "AzureAutomationTutorial",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "runbookType": "GraphPowerShell",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal).",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/AzureAutomationTutorial.graphrunbook', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "name": "AzureAutomationTutorialScript",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "runbookType": "PowerShell",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal).",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/AzureAutomationTutorial.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "name": "AzureAutomationTutorialPython2",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "runbookType": "Python2",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal).",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/AzureAutomationTutorialPython2.py', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces/linkedServices",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE/Automation",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "resourceId": "Microsoft.Automation/automationAccounts/GEN-UNIQUE"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT952 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT952
new file mode 100644
index 0000000..ec79c2f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT952
@@ -0,0 +1,229 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.json",
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962903071,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.json",
+ "/quickstarts/microsoft.automation/101-automation/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT952",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.operationalinsights/workspaces",
+ "microsoft.operationalinsights/workspaces/linkedservices",
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT952",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "workspaceName": {
+ "type": "string",
+ "metadata": {
+ "description": "Workspace name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "pergb2018",
+ "allowedValues": [
+ "pergb2018",
+ "Free",
+ "Standalone",
+ "PerNode",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Pricing tier: perGB2018 or legacy tiers (Free, Standalone, PerNode, Standard or Premium), which are not available to all customers."
+ }
+ },
+ "dataRetention": {
+ "type": "int",
+ "defaultValue": 30,
+ "minValue": 7,
+ "maxValue": 730,
+ "metadata": {
+ "description": "Number of days to retain data."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Specifies the location in which to create the workspace."
+ }
+ },
+ "automationAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Automation account name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sampleGraphicalRunbookName": {
+ "type": "String",
+ "defaultValue": "AzureAutomationTutorial"
+ },
+ "sampleGraphicalRunbookDescription": {
+ "type": "String",
+ "defaultValue": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal)."
+ },
+ "samplePowerShellRunbookName": {
+ "type": "String",
+ "defaultValue": "AzureAutomationTutorialScript"
+ },
+ "samplePowerShellRunbookDescription": {
+ "type": "String",
+ "defaultValue": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal)."
+ },
+ "samplePython2RunbookName": {
+ "type": "String",
+ "defaultValue": "AzureAutomationTutorialPython2"
+ },
+ "samplePython2RunbookDescription": {
+ "type": "String",
+ "defaultValue": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal)."
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "[deployment().properties.templateLink.uri]",
+ "metadata": {
+ "description": "URI to artifacts location"
+ }
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.OperationalInsights/workspaces",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "sku": {
+ "name": "pergb2018"
+ },
+ "retentionInDays": 30,
+ "features": {
+ "searchVersion": 1,
+ "legacy": 0
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2020-01-13-preview",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "properties": {
+ "sku": {
+ "name": "Basic"
+ }
+ },
+ "resources": [
+ {
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "name": "AzureAutomationTutorial",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "runbookType": "GraphPowerShell",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal).",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/AzureAutomationTutorial.graphrunbook', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "name": "AzureAutomationTutorialScript",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "runbookType": "PowerShell",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal).",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/AzureAutomationTutorial.ps1', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ },
+ {
+ "type": "runbooks",
+ "apiVersion": "2020-01-13-preview",
+ "name": "AzureAutomationTutorialPython2",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "runbookType": "Python2",
+ "logProgress": "false",
+ "logVerbose": "false",
+ "description": "An example runbook that gets all the Resource Manager resources by using the Run As account (service principal).",
+ "publishContentLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('scripts/AzureAutomationTutorialPython2.py', parameters('_artifactsLocationSasToken')))]",
+ "version": "1.0.0.0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "Microsoft.OperationalInsights/workspaces/linkedServices",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE/Automation",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "properties": {
+ "resourceId": "Microsoft.Automation/automationAccounts/GEN-UNIQUE"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT953 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT953
new file mode 100644
index 0000000..3fee577
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT953
@@ -0,0 +1,198 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionConfiguration.json"
+ ],
+ "timestamp": 1642962903078,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionConfiguration.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT953",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT953",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "_artifactsLocation": {
+ "type": "string"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "secureString"
+ },
+ "automationAccountName": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string"
+ },
+ "adminUsername": {
+ "type": "string"
+ },
+ "adminPassword": {
+ "type": "secureString"
+ },
+ "domainName": {
+ "type": "string"
+ },
+ "compileName": {
+ "type": "string",
+ "defaultValue": "[guid(resourceGroup().id, deployment().name)]"
+ },
+ "devopsStoragePackagesBase": {
+ "type": "string",
+ "metadata": {
+ "description": "DC Resource URL"
+ }
+ }
+ },
+ "variables": {
+ "dscConfigurations": {
+ "DomainControllerConfig": {
+ "name": "DomainControllerConfig",
+ "description": "minimum viable configuration for a domain controller role",
+ "script": "nested/DomainControllerConfig.ps1"
+ }
+ },
+ "dscResources": {
+ "xActiveDirectory": {
+ "name": "xActiveDirectory",
+ "url": "[uri(parameters('devopsStoragePackagesBase'), 'xactivedirectory.2.17.0.nupkg')]"
+ },
+ "xStorage": {
+ "name": "xStorage",
+ "url": "[uri(parameters('devopsStoragePackagesBase'), 'xstorage.3.4.0.nupkg')]"
+ },
+ "xPendingReboot": {
+ "name": "xPendingReboot",
+ "url": "[uri(parameters('devopsStoragePackagesBase'), 'xpendingreboot.0.3.0.nupkg')]"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "automationAccountName",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiversion": "2020-01-13-preview",
+ "location": "location",
+ "comments": "Automation account for OMS",
+ "properties": {
+ "sku": {
+ "name": "OMS"
+ }
+ },
+ "resources": [
+ {
+ "name": "(dscResources).xActiveDirectory.name",
+ "type": "modules",
+ "apiVersion": "2020-01-13-preview",
+ "location": "location",
+ "dependsOn": [
+ "AutomationAccountName"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(dscResources).xActiveDirectory.url"
+ }
+ }
+ },
+ {
+ "name": "(dscResources).xStorage.name",
+ "type": "modules",
+ "apiVersion": "2020-01-13-preview",
+ "location": "location",
+ "dependsOn": [
+ "AutomationAccountName"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(dscResources).xStorage.url"
+ }
+ }
+ },
+ {
+ "name": "(dscResources).xPendingReboot.name",
+ "type": "modules",
+ "apiVersion": "2020-01-13-preview",
+ "location": "location",
+ "dependsOn": [
+ "AutomationAccountName"
+ ],
+ "properties": {
+ "contentLink": {
+ "uri": "(dscResources).xPendingReboot.url"
+ }
+ }
+ },
+ {
+ "name": "Credential",
+ "type": "credentials",
+ "apiVersion": "2020-01-13-preview",
+ "location": "location",
+ "dependsOn": [
+ "AutomationAccountName"
+ ],
+ "properties": {
+ "userName": "adminUsername",
+ "password": "adminPassword"
+ }
+ },
+ {
+ "name": "(dscConfigurations).DomainControllerConfig.name",
+ "type": "configurations",
+ "apiVersion": "2018-06-30",
+ "location": "location",
+ "dependsOn": [
+ "AutomationAccountName",
+ "(dscResources).xActiveDirectory.name",
+ "(dscResources).xStorage.name",
+ "(dscResources).xPendingReboot.name",
+ "Credential"
+ ],
+ "properties": {
+ "overwrite": true,
+ "source": {
+ "type": "uri",
+ "value": "[uri(parameters('_artifactsLocation'), concat(variables('dscConfigurations').DomainControllerConfig.script, parameters('_artifactsLocationSasToken')))]"
+ }
+ }
+ },
+ {
+ "name": "[guid(resourceGroup().id, deployment().name)]",
+ "type": "compilationjobs",
+ "apiVersion": "2020-01-13-preview",
+ "location": "location",
+ "dependsOn": [
+ "AutomationAccountName",
+ "(dscConfigurations).DomainControllerConfig.name"
+ ],
+ "properties": {
+ "configuration": {
+ "name": "(dscConfigurations).DomainControllerConfig.name"
+ },
+ "parameters": {
+ "configurationData": "{\"AllNodes\":{\"nodename\":\"localhost\"\"domainname\":\"domainName\"}}"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT954 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT954
new file mode 100644
index 0000000..f02e7d5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT954
@@ -0,0 +1,85 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionDNS.json"
+ ],
+ "timestamp": 1642962903085,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionDNS.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT954",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT954",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "Description": "The region to deploy the resources into"
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "Description": "The name of the Virtual Network"
+ }
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string",
+ "metadata": {
+ "Description": "The address range of the virtual network in CIDR format"
+ },
+ "defaultValue": "10.0.0.0/16"
+ },
+ "virtualNetworkSubnets": {
+ "type": "array",
+ "metadata": {
+ "Description": "The subnet definition for the virtual network"
+ }
+ },
+ "dnsAddress": {
+ "type": "array",
+ "metadata": {
+ "Description": "The DNS address(es) of the DNS Server(s) used by the virtual network"
+ }
+ }
+ },
+ "resources": [
+ {
+ "name": "virtualNetworkName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "apiVersion": "2020-05-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "dhcpOptions": {
+ "dnsServers": "dnsAddress"
+ },
+ "subnets": "virtualNetworkSubnets"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT955 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT955
new file mode 100644
index 0000000..24a1d7f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT955
@@ -0,0 +1,119 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionNetwork.json"
+ ],
+ "timestamp": 1642962903092,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionNetwork.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT955",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT955",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "virtualNetworkName": {
+ "type": "string"
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string"
+ },
+ "virtualNetworkSubnets": {
+ "type": "array"
+ },
+ "nicName": {
+ "type": "string"
+ },
+ "nicIPAddress": {
+ "type": "string"
+ },
+ "nicSubnetRef": {
+ "type": "string"
+ },
+ "publicIPAddressName": {
+ "type": "string"
+ },
+ "publicIPAddressType": {
+ "type": "string"
+ }
+ },
+ "resources": [
+ {
+ "name": "virtualNetworkName",
+ "type": "Microsoft.Network/virtualNetworks",
+ "location": "location",
+ "apiVersion": "2020-05-01",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "virtualNetworkAddressRange"
+ ]
+ },
+ "subnets": "virtualNetworkSubnets"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "publicIPAddressName",
+ "location": "location",
+ "dependsOn": [
+ "virtualNetworkName"
+ ],
+ "properties": {
+ "publicIPAllocationMethod": "publicIPAddressType"
+ }
+ },
+ {
+ "name": "nicName",
+ "type": "Microsoft.Network/networkInterfaces",
+ "location": "location",
+ "apiVersion": "2020-05-01",
+ "dependsOn": [
+ "virtualNetworkName",
+ "publicIPAddressName"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "privateipconfig",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "nicIPAddress",
+ "subnet": {
+ "id": "nicSubnetRef"
+ },
+ "publicIPAddress": {
+ "id": "[resourceId ('Microsoft.Network/publicIPAddresses/', parameters('publicIPAddressName'))]"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT956 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT956
new file mode 100644
index 0000000..1285b82
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT956
@@ -0,0 +1,177 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionServer.json"
+ ],
+ "timestamp": 1642962903099,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/nested/provisionServer.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT956",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.automation/automationaccounts",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT956",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string"
+ },
+ "vmName": {
+ "type": "string"
+ },
+ "vmSize": {
+ "type": "string"
+ },
+ "adminUsername": {
+ "type": "string"
+ },
+ "adminPassword": {
+ "type": "securestring"
+ },
+ "nicName": {
+ "type": "string"
+ },
+ "automationAccountName": {
+ "type": "string"
+ },
+ "nodeConfigurationName": {
+ "type": "string",
+ "defaultValue": "DomainControllerConfig.localhost"
+ }
+ },
+ "resources": [
+ {
+ "name": "automationAccountName",
+ "type": "Microsoft.Automation/automationAccounts",
+ "apiVersion": "2020-01-13-preview",
+ "location": "location",
+ "comments": "Automation account for OMS",
+ "properties": {
+ "sku": {
+ "name": "OMS"
+ }
+ }
+ },
+ {
+ "name": "VMName",
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-06-01",
+ "location": "location",
+ "dependsOn": [
+ "automationAccountName"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "VMSize"
+ },
+ "osProfile": {
+ "computerName": "VMName",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter-Server-Core",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "createOption": "Empty",
+ "diskSizeGB": 100,
+ "lun": 0
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/NicName"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "VMName/OnboardToDSC",
+ "apiVersion": "2020-06-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//VMName"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Powershell",
+ "type": "DSC",
+ "typeHandlerVersion": "2.75",
+ "autoUpgradeMinorVersion": true,
+ "protectedSettings": {
+ "Items": {
+ "registrationKeyPrivate": "[listKeys(resourceId('Microsoft.Automation/automationAccounts/', parameters('automationAccountName')), '2020-01-13-preview').Keys[0].value]"
+ }
+ },
+ "settings": {
+ "Properties": [
+ {
+ "Name": "RegistrationKey",
+ "Value": {
+ "UserName": "PLACEHOLDER_DONOTUSE",
+ "Password": "PrivateSettingsRef:registrationKeyPrivate"
+ },
+ "TypeName": "System.Management.Automation.PSCredential"
+ },
+ {
+ "Name": "RegistrationUrl",
+ "Value": "[reference(resourceId('Microsoft.Automation/automationAccounts/', parameters('automationAccountName'))).registrationUrl]",
+ "TypeName": "System.String"
+ },
+ {
+ "Name": "NodeConfigurationName",
+ "Value": "DomainControllerConfig.localhost",
+ "TypeName": "System.String"
+ },
+ {
+ "Name": "ConfigurationMode",
+ "Value": "ApplyandAutoCorrect",
+ "TypeName": "System.String"
+ },
+ {
+ "Name": "RebootNodeIfNeeded",
+ "Value": true,
+ "TypeName": "System.Boolean"
+ },
+ {
+ "Name": "ActionAfterReboot",
+ "Value": "ContinueConfiguration",
+ "TypeName": "System.String"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT957 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT957
new file mode 100644
index 0000000..d385663
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT957
@@ -0,0 +1,314 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/azuredeploy.json",
+ "/quickstarts/microsoft.automation/automation-configuration/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903107,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.automation/automation-configuration/azuredeploy.json",
+ "/quickstarts/microsoft.automation/automation-configuration/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT957",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT957",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "The Azure location to deploy all resources"
+ },
+ "defaultValue": "[resourceGroup().location]"
+ },
+ "virtualNetworkAddressRange": {
+ "type": "string",
+ "metadata": {
+ "description": "The address range of the new virtual network "
+ },
+ "defaultValue": "10.0.0.0/16"
+ },
+ "virtualNetworkSubnet": {
+ "type": "string",
+ "metadata": {
+ "description": "The address range of the subnet created in the new virtual network"
+ },
+ "defaultValue": "10.0.0.0/24"
+ },
+ "nicIPAddress": {
+ "type": "string",
+ "metadata": {
+ "description": "The IP address of the new AD VM"
+ },
+ "defaultValue": "10.0.0.4"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Administrator of the new VM and Domain"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The password for the Administrator account of the new VM and Domain"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "VMSize": {
+ "type": "string",
+ "metadata": {
+ "description": "The size of the VM Created"
+ },
+ "defaultValue": "Standard_D2s_v3"
+ },
+ "domainName": {
+ "type": "string",
+ "metadata": {
+ "description": "The full qualified domain name to be created"
+ },
+ "defaultValue": "contoso.local"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Path to the nested templates used in this deployment"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "secureString",
+ "metadata": {
+ "description": "SAS token to access artifacts location, if required"
+ },
+ "defaultValue": ""
+ },
+ "compileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique value to identify compilation job"
+ },
+ "defaultValue": "[guid(resourceGroup().id, deployment().name)]"
+ },
+ "devopsStoragePackagesBase": {
+ "type": "string",
+ "metadata": {
+ "description": "DevOps Gallery Storage Package Base"
+ },
+ "value": "https://devopsgallerystorage.blob.core.windows.net/packages/"
+ }
+ },
+ "variables": {
+ "automationAccountName": "[concat('DSC-',take(guid(resourceGroup().id),5))]",
+ "publicIPAddressName": "PIP",
+ "publicIPAddressType": "Dynamic",
+ "virtualNetworkName": "Network",
+ "virtualNetworkSubnetName": "Subnet",
+ "virtualNetworkSubnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ],
+ "VMName": "Server",
+ "nicName": "NIC",
+ "nicSubnetRef": "Microsoft.Network/virtualNetworks/subnets/Network/Subnet",
+ "provisionConfigurationURL": "[uri(parameters('_artifactsLocation'), concat('nested/provisionConfiguration.json', parameters('_artifactsLocationSasToken')))]",
+ "provisionNetworkURL": "[uri(parameters('_artifactsLocation'), concat('nested/provisionNetwork.json', parameters('_artifactsLocationSasToken')))]",
+ "provisionServerUrl": "[uri(parameters('_artifactsLocation'), concat('nested/provisionServer.json', parameters('_artifactsLocationSasToken')))]",
+ "provisionDNSUrl": "[uri(parameters('_artifactsLocation'), concat('nested/provisionDNS.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "resources": [
+ {
+ "name": "provisionConfiguration",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/provisionConfiguration.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "_artifactsLocation": {
+ "value": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "value": ""
+ },
+ "automationAccountName": {
+ "value": "[variables('automationAccountName')]"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "domainName": {
+ "value": "contoso.local"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "compileName": {
+ "value": "[guid(resourceGroup().id, deployment().name)]"
+ },
+ "devopsStoragePackagesBase": {
+ "value": "https://devopsgallerystorage.blob.core.windows.net/packages/"
+ }
+ }
+ }
+ },
+ {
+ "name": "provisionNetwork",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/provisionNetwork.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "virtualNetworkName": {
+ "value": "Network"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "virtualNetworkSubnets": {
+ "value": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ },
+ "nicName": {
+ "value": "NIC"
+ },
+ "nicIPAddress": {
+ "value": "10.0.0.4"
+ },
+ "nicSubnetRef": {
+ "value": "Microsoft.Network/virtualNetworks/subnets/Network/Subnet"
+ },
+ "publicIPAddressName": {
+ "value": "PIP"
+ },
+ "publicIPAddressType": {
+ "value": "Dynamic"
+ }
+ }
+ }
+ },
+ {
+ "name": "provisionServer",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "provisionNetwork",
+ "provisionConfiguration"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/provisionServer.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "VMName": {
+ "value": "Server"
+ },
+ "VMSize": {
+ "value": "Standard_D2s_v3"
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "NicName": {
+ "value": "NicName"
+ },
+ "automationAccountName": {
+ "value": "[variables('automationAccountName')]"
+ }
+ }
+ }
+ },
+ {
+ "name": "provisionDNS",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-06-01",
+ "dependsOn": [
+ "provisionServer"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('nested/provisionDNS.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "virtualNetworkName": {
+ "value": "Network"
+ },
+ "virtualNetworkAddressRange": {
+ "value": "10.0.0.0/16"
+ },
+ "virtualNetworkSubnets": {
+ "value": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ },
+ "dnsAddress": {
+ "value": [
+ "10.0.0.4"
+ ]
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT958 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT958
new file mode 100644
index 0000000..28e8ee1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT958
@@ -0,0 +1,115 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903116,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT958",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/certificates",
+ "microsoft.storage/storageaccounts",
+ "microsoft.batch/batchaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT958",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "certificatePrefixName": {
+ "type": "string",
+ "value": "GEN-SELFSIGNED-CERT-DNSNAME"
+ },
+ "certificatePfxBase64": {
+ "type": "securestring",
+ "value": "GEN-SELFSIGNED-CERT-PFXDATA"
+ },
+ "certificatePfxPassword": {
+ "type": "securestring",
+ "value": "GEN-SELFSIGNED-CERT-PASSWORD"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]"
+ },
+ "storagename": {
+ "type": "string",
+ "value": "GEN-UNIQUE"
+ },
+ "batchname": {
+ "type": "string",
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "variables": {
+ "certificateName": "GEN-SELFSIGNED-CERT-DNSNAME"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Web/certificates",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-SELFSIGNED-CERT-DNSNAME",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "pfxBlob": "GEN-SELFSIGNED-CERT-PFXDATA",
+ "password": "GEN-SELFSIGNED-CERT-PASSWORD"
+ },
+ "tags": {
+ "displayName": "Certificate"
+ }
+ },
+ {
+ "apiVersion": "2019-04-01",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage"
+ },
+ {
+ "type": "Microsoft.Batch/batchAccounts",
+ "apiVersion": "2019-04-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "autoStorage": {
+ "storageAccountId": "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "outputs": {
+ "batchservice": {
+ "type": "string",
+ "value": "[parameters('batchname')]"
+ },
+ "certthumbprint": {
+ "type": "string",
+ "value": "[reference(variables('certificateName')).thumbprint]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT959 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT959
new file mode 100644
index 0000000..7f4a786
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT959
@@ -0,0 +1,83 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/azuredeploy.json",
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903124,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/azuredeploy.json",
+ "/quickstarts/microsoft.batch/batch-with-keyvault-pfx-password/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT959",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.batch/batchaccounts/certificates"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT959",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "batchservice": {
+ "type": "string",
+ "metadata": {
+ "description": "batch acount name"
+ },
+ "value": "GET-PREREQ-batchservice"
+ },
+ "certdata": {
+ "type": "securestring",
+ "metadata": {
+ "description": "certificate securestring reference to keyvault"
+ },
+ "value": "GEN-SELFSIGNED-CERT-PFXDATA"
+ },
+ "certthumbprint": {
+ "type": "securestring",
+ "metadata": {
+ "description": "keyvault certificate thumbprint"
+ },
+ "value": "GET-PREREQ-certthumbprint"
+ },
+ "certpassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "keyvault certificate pfx password"
+ },
+ "value": "GEN-SELFSIGNED-CERT-PASSWORD"
+ }
+ },
+ "variables": {
+ "certname": "GET-PREREQ-batchservice/SHA1-GET-PREREQ-certthumbprint"
+ },
+ "resources": [
+ {
+ "name": "GET-PREREQ-batchservice/SHA1-GET-PREREQ-certthumbprint",
+ "type": "Microsoft.Batch/batchAccounts/certificates",
+ "apiVersion": "2021-01-01",
+ "properties": {
+ "format": "Pfx",
+ "thumbprint": "GET-PREREQ-certthumbprint",
+ "thumbprintAlgorithm": "SHA1",
+ "data": "GEN-SELFSIGNED-CERT-PFXDATA",
+ "password": "GEN-SELFSIGNED-CERT-PASSWORD"
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT96 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT96
new file mode 100644
index 0000000..0d9d5d8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT96
@@ -0,0 +1,231 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/tableau-server.json"
+ ],
+ "timestamp": 1642962886071,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/nested/tableau-server.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT96",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.storage/storageaccounts",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT96",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin user name for the VMs"
+ }
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password for the VMs (A mix of upper and lower-case characters, digits and symbols)"
+ }
+ },
+ "vnetID": {
+ "type": "string"
+ },
+ "resourceAPIVersion": {
+ "type": "string"
+ },
+ "dnsNamePrefix": {
+ "type": "string"
+ },
+ "scriptsUri": {
+ "type": "string"
+ },
+ "storageAccount": {
+ "type": "object"
+ },
+ "vmSpec": {
+ "type": "secureObject"
+ },
+ "networkSpec": {
+ "type": "object"
+ },
+ "windowsOSVersion": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "allowedValues": [
+ "2008-R2-SP1",
+ "2012-Datacenter",
+ "2012-R2-Datacenter"
+ ],
+ "metadata": {
+ "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
+ }
+ },
+ "clouderaTags": {
+ "type": "object"
+ },
+ "tableauTags": {
+ "type": "object"
+ },
+ "quickstartTags": {
+ "type": "object"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "tsstorageAccount",
+ "sizeOfDiskInGB": "100",
+ "dataDisk1VhdName": "datadisk1",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageOffer": "WindowsServer",
+ "OSDiskName": "osdiskforwindowssimple",
+ "vmName": "dnsNamePrefix-ts",
+ "nicName": "dnsNamePrefix-ts-nic",
+ "publicIPAddressName": "dnsNamePrefix-ts-publicIP",
+ "publicIPAddressType": "Dynamic",
+ "vmStorageAccountContainerName": "vhds",
+ "vmSize": "Standard_A3",
+ "apiVersion": "2015-06-15"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "tsstorageAccount",
+ "location": "[resourceGroup().location]",
+ "comments": "Utilizes the Cloudera master storage account",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "clouderaTags"
+ },
+ "properties": {
+ "accountType": "storageAccount"
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "dnsNamePrefix-ts-publicIP",
+ "location": "[resourceGroup().location]",
+ "comments": "Tableau Server Public IP Address",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "tableauTags"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "dnsNamePrefix-ts-nic",
+ "location": "[resourceGroup().location]",
+ "comments": "Tableau Server nic name",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "tableauTags"
+ },
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/dnsNamePrefix-ts-publicIP"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/dnsNamePrefix-ts-publicIP"
+ },
+ "subnet": {
+ "id": "vnetID/subnets/networkSpec"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2017-03-30",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "dnsNamePrefix-ts",
+ "location": "[resourceGroup().location]",
+ "comments": "Tableau Server VM",
+ "tags": {
+ "quickstartName": "quickstartTags",
+ "provider": "tableauTags"
+ },
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/tsstorageAccount",
+ "Microsoft.Network/networkInterfaces/dnsNamePrefix-ts-nic"
+ ],
+ "plan": {
+ "name": "bring-your-own-license",
+ "product": "tableau-server",
+ "publisher": "tableau"
+ },
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSpec"
+ },
+ "osProfile": {
+ "computerName": "dnsNamePrefix-ts",
+ "adminUsername": "adminUsername",
+ "adminPassword": "adminPassword"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "tableau",
+ "offer": "tableau-server",
+ "sku": "bring-your-own-license",
+ "version": "latest"
+ },
+ "osDisk": {
+ "name": "dnsNamePrefix-ts_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "name": "dnsNamePrefix-ts_DataDisk1",
+ "diskSizeGB": "100",
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/dnsNamePrefix-ts-nic"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT960 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT960
new file mode 100644
index 0000000..72d8ba8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT960
@@ -0,0 +1,112 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.batch/batchaccount-with-storage/azuredeploy.json",
+ "/quickstarts/microsoft.batch/batchaccount-with-storage/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903131,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.batch/batchaccount-with-storage/azuredeploy.json",
+ "/quickstarts/microsoft.batch/batchaccount-with-storage/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT960",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts",
+ "microsoft.batch/batchaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT960",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "batchAccountName": {
+ "type": "string",
+ "defaultValue": "[concat(toLower(uniqueString(resourceGroup().id)), 'batch')]",
+ "metadata": {
+ "description": "Batch Account Name"
+ }
+ },
+ "storageAccountsku": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Standard_GRS",
+ "Standard_ZRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "Storage Account type"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat(uniqueString(resourceGroup().id),'storage')]"
+ },
+ "resources": [
+ {
+ "comments": "This storage account is used to associate to a batch account",
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2019-06-01",
+ "name": "storageAccountname",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2",
+ "tags": {
+ "ObjectName": "[variables('storageAccountName')]"
+ },
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Batch/batchAccounts",
+ "apiVersion": "2020-05-01",
+ "name": "[concat(toLower(uniqueString(resourceGroup().id)), 'batch')]",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
+ ],
+ "tags": {
+ "ObjectName": "[concat(toLower(uniqueString(resourceGroup().id)), 'batch')]"
+ },
+ "properties": {
+ "autoStorage": {
+ "storageAccountId": "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "storageAccountName": {
+ "type": "string",
+ "value": "[variables('storageAccountName')]"
+ },
+ "batchAccountName": {
+ "type": "string",
+ "value": "[parameters('batchAccountName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT961 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT961
new file mode 100644
index 0000000..b201c3e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT961
@@ -0,0 +1,120 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.blockchain/blockchain-asaservice/azuredeploy.json",
+ "/quickstarts/microsoft.blockchain/blockchain-asaservice/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903137,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.blockchain/blockchain-asaservice/azuredeploy.json",
+ "/quickstarts/microsoft.blockchain/blockchain-asaservice/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT961",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.blockchain/blockchainmembers"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT961",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "bcMemberName": {
+ "type": "String",
+ "metadata": {
+ "description": "Azure Blockchain Service member name. The blockchain member name must be unique and can only contain lowercase letters and numbers. The first character must be a letter. The value must be between 2 and 20 characters long."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "consortiumName": {
+ "type": "String",
+ "metadata": {
+ "description": "Consortium name. The new consortium name must be unique."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "memberPassword": {
+ "type": "secureString",
+ "metadata": {
+ "description": "The password for the member's default transaction node. Use the password for basic authentication when connecting to blockchain member's default transaction node public endpoint. The password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number, and 1 special character that is not '#', '`', '*', '\"', ''', '-', '%',' ' or ';'."
+ },
+ "value": "GEN-PASSWORD-AMP"
+ },
+ "consortiumManagementAccountPassword": {
+ "type": "secureString",
+ "metadata": {
+ "description": "The consortium management account password is used to encrypt the private key for the Ethereum account that is created for your member. You use the member account and member account password for consortium management. The password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number, and 1 special character that is not '#', '`', '*', '\"', ''', '-', '%',' ' or ';'."
+ },
+ "value": "GEN-PASSWORD-AMP"
+ },
+ "skuTier": {
+ "type": "string",
+ "defaultValue": "Basic",
+ "metadata": {
+ "description": "Use Basic or Standard. Use the Basic tier for development, testing, and proof of concepts. Use the Standard tier for production grade deployments. You should also use the Standard tier if you are using Blockchain Data Manager or sending a high volume of private transactions. Changing the pricing tier between basic and standard after member creation is not supported."
+ }
+ },
+ "skuName": {
+ "type": "string",
+ "defaultValue": "B0",
+ "metadata": {
+ "description": "Use S0 for Standard and B0 for Basic."
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ },
+ "value": "westus2"
+ }
+ },
+ "variables": {},
+ "resources": [
+ {
+ "type": "Microsoft.Blockchain/blockchainMembers",
+ "apiVersion": "2018-06-01-preview",
+ "name": "GEN-UNIQUE",
+ "location": "westus2",
+ "sku": {
+ "name": "B0",
+ "tier": "Basic"
+ },
+ "tags": {
+ "consortium": "Consortium"
+ },
+ "properties": {
+ "protocol": "Quorum",
+ "consensus": "Default",
+ "password": "GEN-PASSWORD-AMP",
+ "validatorNodesSku": {
+ "capacity": 1
+ },
+ "consortium": "GEN-UNIQUE",
+ "consortiumManagementAccountPassword": "GEN-PASSWORD-AMP",
+ "firewallRules": [
+ {
+ "ruleName": "AllowAll",
+ "startIpAddress": "0.0.0.0",
+ "endIpAddress": "255.255.255.255"
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT962 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT962
new file mode 100644
index 0000000..f08b56a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT962
@@ -0,0 +1,74 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-cache/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-cache/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903144,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-cache/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-cache/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT962",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT962",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat(uniqueString(resourceGroup().id),'storage')]"
+ },
+ "resources": [
+ {
+ "comments": "Storage account used to store diagnostics data",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ }
+ ],
+ "outputs": {
+ "existingDiagnosticsStorageAccountName": {
+ "type": "string",
+ "value": "[variables('storageAccountName')]"
+ },
+ "existingDiagnosticsStorageAccountResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT963 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT963
new file mode 100644
index 0000000..2358a3f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT963
@@ -0,0 +1,167 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-cache/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-cache/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903149,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-cache/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-cache/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT963",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cache/redis",
+ "microsoft.insights/diagnosticsettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT963",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.63.48766",
+ "templateHash": "15185429886065480175"
+ }
+ },
+ "parameters": {
+ "redisCacheName": {
+ "type": "string",
+ "defaultValue": "[format('redisCache-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Specify the name of the Azure Redis Cache to create."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of all resources"
+ }
+ },
+ "redisCacheSKU": {
+ "type": "string",
+ "defaultValue": "Standard",
+ "allowedValues": [
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Specify the pricing tier of the new Azure Redis Cache."
+ }
+ },
+ "redisCacheFamily": {
+ "type": "string",
+ "defaultValue": "C",
+ "allowedValues": [
+ "C",
+ "P"
+ ],
+ "metadata": {
+ "description": "Specify the family for the sku. C = Basic/Standard, P = Premium."
+ }
+ },
+ "redisCacheCapacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "metadata": {
+ "description": "Specify the size of the new Azure Redis Cache instance. Valid values: for C (Basic/Standard) family (0, 1, 2, 3, 4, 5, 6), for P (Premium) family (1, 2, 3, 4)"
+ }
+ },
+ "enableNonSslPort": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specify a boolean value that indicates whether to allow access via non-SSL ports."
+ }
+ },
+ "diagnosticsEnabled": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specify a boolean value that indicates whether diagnostics should be saved to the specified storage account."
+ }
+ },
+ "existingDiagnosticsStorageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of an existing storage account for diagnostics."
+ },
+ "value": "GET-PREREQ-existingDiagnosticsStorageAccountName"
+ },
+ "existingDiagnosticsStorageAccountResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the resource group name of an existing storage account for diagnostics."
+ },
+ "value": "GET-PREREQ-existingDiagnosticsStorageAccountResourceGroup"
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cache/redis",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "enableNonSslPort": false,
+ "minimumTlsVersion": "1.2",
+ "sku": {
+ "capacity": 1,
+ "family": "C",
+ "name": "Standard"
+ }
+ }
+ },
+ {
+ "type": "microsoft.insights/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "scope": "[format('Microsoft.Cache/redis/{0}', parameters('redisCacheName'))]",
+ "name": "GEN-UNIQUE",
+ "properties": {
+ "storageAccountId": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('existingDiagnosticsStorageAccountResourceGroup')), 'Microsoft.Storage/storageAccounts', parameters('existingDiagnosticsStorageAccountName'))]",
+ "metrics": [
+ {
+ "timeGrain": "AllMetrics",
+ "enabled": false,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": false
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Cache/redis/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT964 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT964
new file mode 100644
index 0000000..8e0d424
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT964
@@ -0,0 +1,443 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903154,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT964",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT964",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Administrator user name used when provisioning virtual machines"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "redisVirtNet",
+ "metadata": {
+ "description": "The arbitrary name of the virtual network provisioned for the Redis cluster"
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "The network address space for the virtual network"
+ },
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "redisSubnet1",
+ "metadata": {
+ "description": "Subnet name for the virtual network that resources will be provisioned in to"
+ },
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "Address space for the virtual network subnet"
+ },
+ "value": "10.0.0.0/24"
+ },
+ "nodeAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.1",
+ "metadata": {
+ "description": "The IP address prefix that will be used for constructing a static private IP address for each node in the cluster"
+ },
+ "value": "10.0.0.1"
+ },
+ "jumpbox": {
+ "type": "string",
+ "defaultValue": "Disabled",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ],
+ "metadata": {
+ "description": "The flag allowing to enable or disable provisioning of the jumpbox VM that can be used to access the Redis nodes"
+ },
+ "value": "Enabled"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1_V2",
+ "metadata": {
+ "description": "Size of the VM."
+ }
+ },
+ "tshirtSize": {
+ "type": "string",
+ "defaultValue": "Small",
+ "allowedValues": [
+ "Small",
+ "Medium",
+ "Large"
+ ],
+ "metadata": {
+ "description": "T-shirt size of the Redis deployment"
+ },
+ "value": "Small"
+ },
+ "redisVersion": {
+ "type": "string",
+ "defaultValue": "stable",
+ "metadata": {
+ "description": "The version of the Redis package to be deployed on the cluster (or use 'stable' to pull in the latest and greatest)"
+ },
+ "value": "3.0.0"
+ },
+ "redisClusterName": {
+ "type": "string",
+ "defaultValue": "redis-cluster",
+ "metadata": {
+ "description": "The arbitrary name of the Redis cluster"
+ },
+ "value": "redis-arm-cluster"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located including a trailing '/'"
+ },
+ "defaultValue": "[deployment().properties.templateLink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
+ },
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "deploymentSize": {
+ "Small": {
+ "vmSizeMember": "Standard_A1",
+ "numberOfMasters": 3,
+ "numberOfSlaves": 0,
+ "totalMemberCount": 3,
+ "totalMemberCountExcludingLast": 2,
+ "vmTemplate": "[uri(parameters('_artifactsLocation'), concat('node-resources.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "Medium": {
+ "vmSizeMember": "Standard_A2",
+ "numberOfMasters": 3,
+ "numberOfSlaves": 3,
+ "totalMemberCount": 6,
+ "totalMemberCountExcludingLast": 5,
+ "vmTemplate": "[uri(parameters('_artifactsLocation'), concat('node-resources.json', parameters('_artifactsLocationSasToken')))]"
+ },
+ "Large": {
+ "vmSizeMember": "Standard_A5",
+ "numberOfMasters": 3,
+ "numberOfSlaves": 6,
+ "totalMemberCount": 9,
+ "totalMemberCountExcludingLast": 8,
+ "arbiter": "Enabled",
+ "vmTemplate": "[uri(parameters('_artifactsLocation'), concat('node-resources.json', parameters('_artifactsLocationSasToken')))]"
+ }
+ },
+ "osFamilyUbuntu": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "imageSKU": "14.04.5-LTS"
+ },
+ "commonSettings": {
+ "availabilitySetName": "redisAvailSet"
+ },
+ "sharedTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('shared-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "jumpboxTemplateUrl": "[uri(parameters('_artifactsLocation'), concat('jumpbox-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "networkSettings": {
+ "virtualNetworkName": "GEN-VNET-NAME",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "GEN-VNET-SUBNET1-NAME",
+ "subnetPrefix": "10.0.0.0/24",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "machineIpPrefix": "10.0.0.1"
+ },
+ "machineSettings": {
+ "adminUsername": "GEN-UNIQUE",
+ "machineNamePrefix": "redisnode-",
+ "osImageReference": {
+ "publisher": "(osFamilyUbuntu).imagePublisher",
+ "offer": "(osFamilyUbuntu).imageOffer",
+ "sku": "(osFamilyUbuntu).imageSKU",
+ "version": "latest"
+ }
+ },
+ "clusterSpec": "(deploymentSize)[parameters(tshirtSize)]",
+ "installCommand": "redis-cluster-install.sh -n redis-arm-cluster -v 3.0.0 -c (clusterSpec).totalMemberCount -m (clusterSpec).numberOfMasters -s (clusterSpec).numberOfSlaves -p (networkSettings).machineIpPrefix",
+ "vmScripts": {
+ "scriptsToDownload": [
+ "[uri(parameters('_artifactsLocation'), concat('redis-cluster-install.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('redis-cluster-setup.sh', parameters('_artifactsLocationSasToken')))]",
+ "[uri(parameters('_artifactsLocation'), concat('redis-sentinel-startup.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "installCommand": "bash redis-cluster-install.sh -n redis-arm-cluster -v 3.0.0 -c (clusterSpec).totalMemberCount -m (clusterSpec).numberOfMasters -s (clusterSpec).numberOfSlaves -p (networkSettings).machineIpPrefix",
+ "setupCommand": "bash redis-cluster-install.sh -n redis-arm-cluster -v 3.0.0 -c (clusterSpec).totalMemberCount -m (clusterSpec).numberOfMasters -s (clusterSpec).numberOfSlaves -p (networkSettings).machineIpPrefix -l"
+ }
+ },
+ "resources": [
+ {
+ "name": "shared-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('shared-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "commonSettings": {
+ "value": {
+ "availabilitySetName": "redisAvailSet"
+ }
+ },
+ "networkSettings": {
+ "value": {
+ "virtualNetworkName": "GEN-VNET-NAME",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "GEN-VNET-SUBNET1-NAME",
+ "subnetPrefix": "10.0.0.0/24",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "machineIpPrefix": "10.0.0.1"
+ }
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "condition": false,
+ "name": "jumpbox-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[uri(parameters('_artifactsLocation'), concat('jumpbox-resources.json', parameters('_artifactsLocationSasToken')))]",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "networkSettings": {
+ "value": {
+ "virtualNetworkName": "GEN-VNET-NAME",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "GEN-VNET-SUBNET1-NAME",
+ "subnetPrefix": "10.0.0.0/24",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "machineIpPrefix": "10.0.0.1"
+ }
+ },
+ "machineSettings": {
+ "value": {
+ "adminUsername": "GEN-UNIQUE",
+ "machineNamePrefix": "redisnode-",
+ "osImageReference": {
+ "publisher": "(osFamilyUbuntu).imagePublisher",
+ "offer": "(osFamilyUbuntu).imageOffer",
+ "sku": "(osFamilyUbuntu).imageSKU",
+ "version": "latest"
+ }
+ }
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ },
+ "vmSize": {
+ "value": "Standard_A1_V2"
+ }
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Resources/deployments",
+ "name": "node-resourcescopyindex()",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "Microsoft.Resources/deployments//shared-resources"
+ ],
+ "copy": {
+ "name": "memberNodesLoop",
+ "count": "(clusterSpec).totalMemberCountExcludingLast"
+ },
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(clusterSpec).vmTemplate",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "commonSettings": {
+ "value": {
+ "availabilitySetName": "redisAvailSet"
+ }
+ },
+ "networkSettings": {
+ "value": {
+ "virtualNetworkName": "GEN-VNET-NAME",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "GEN-VNET-SUBNET1-NAME",
+ "subnetPrefix": "10.0.0.0/24",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "machineIpPrefix": "10.0.0.1"
+ }
+ },
+ "machineSettings": {
+ "value": {
+ "adminUsername": "(machineSettings).adminUsername",
+ "machineNamePrefix": "(machineSettings).machineNamePrefix",
+ "osImageReference": "(machineSettings).osImageReference",
+ "vmSize": "(clusterSpec).vmSizeMember",
+ "machineIndex": "[copyindex()]",
+ "vmScripts": "(vmScripts).scriptsToDownload",
+ "commandToExecute": "(vmScripts).installCommand -i copyindex()"
+ }
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ },
+ {
+ "name": "lastnode-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2020-10-01",
+ "dependsOn": [
+ "memberNodesLoop"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "(clusterSpec).vmTemplate",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "commonSettings": {
+ "value": {
+ "availabilitySetName": "redisAvailSet"
+ }
+ },
+ "networkSettings": {
+ "value": {
+ "virtualNetworkName": "GEN-VNET-NAME",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "GEN-VNET-SUBNET1-NAME",
+ "subnetPrefix": "10.0.0.0/24",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/GEN-VNET-NAME/GEN-VNET-SUBNET1-NAME",
+ "machineIpPrefix": "10.0.0.1"
+ }
+ },
+ "machineSettings": {
+ "value": {
+ "adminUsername": "(machineSettings).adminUsername",
+ "machineNamePrefix": "(machineSettings).machineNamePrefix",
+ "osImageReference": "(machineSettings).osImageReference",
+ "vmSize": "(clusterSpec).vmSizeMember",
+ "machineIndex": "(clusterSpec).totalMemberCountExcludingLast",
+ "vmScripts": "(vmScripts).scriptsToDownload",
+ "commandToExecute": "(vmScripts).setupCommand -i (clusterSpec).totalMemberCountExcludingLast"
+ }
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "authenticationType": {
+ "value": "sshPublicKey"
+ },
+ "location": {
+ "value": "[resourceGroup().location]"
+ }
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "installCommand": {
+ "value": "[variables('vmScripts').installCommand]",
+ "type": "string"
+ },
+ "setupCommand": {
+ "value": "[variables('vmScripts').setupCommand]",
+ "type": "string"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT965 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT965
new file mode 100644
index 0000000..29061ff
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT965
@@ -0,0 +1,71 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/empty-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903163,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/empty-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT965",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": []
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT965",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-VNET-NAME"
+ },
+ "subnetName": {
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "addressPrefix": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetPrefix": {
+ "value": "10.0.0.0/24"
+ },
+ "nodeAddressPrefix": {
+ "value": "10.0.0.1"
+ },
+ "redisVersion": {
+ "value": "3.0.0"
+ },
+ "redisClusterName": {
+ "value": "redis-arm-cluster"
+ },
+ "jumpbox": {
+ "value": "Enabled"
+ },
+ "tshirtSize": {
+ "value": "Small"
+ }
+ },
+ "variables": {},
+ "resources": [],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT966 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT966
new file mode 100644
index 0000000..db0b02e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT966
@@ -0,0 +1,218 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/jumpbox-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903168,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/jumpbox-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT966",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT966",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "networkSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Network settings object"
+ }
+ },
+ "machineSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Machine settings object"
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "Description": "Administrator password used when provisioning virtual machines"
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "metadata": {
+ "description": "Size of the VM."
+ }
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-VNET-NAME"
+ },
+ "subnetName": {
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "addressPrefix": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetPrefix": {
+ "value": "10.0.0.0/24"
+ },
+ "nodeAddressPrefix": {
+ "value": "10.0.0.1"
+ },
+ "redisVersion": {
+ "value": "3.0.0"
+ },
+ "redisClusterName": {
+ "value": "redis-arm-cluster"
+ },
+ "jumpbox": {
+ "value": "Enabled"
+ },
+ "tshirtSize": {
+ "value": "Small"
+ }
+ },
+ "variables": {
+ "securityGroupName": "jumpboxNSG",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/machineSettings/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "name": "jumpboxNSG",
+ "location": "location",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "SSH",
+ "properties": {
+ "description": "Allows SSH traffic",
+ "protocol": "Tcp",
+ "sourcePortRange": "*",
+ "destinationPortRange": "22",
+ "sourceAddressPrefix": "*",
+ "destinationAddressPrefix": "*",
+ "access": "Allow",
+ "priority": 100,
+ "direction": "Inbound"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "jumpboxPublicIP",
+ "location": "location",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "jumpboxNIC",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//jumpboxPublicIP",
+ "Microsoft.Network/networkSecurityGroups//jumpboxNSG"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipConfigJumpbox",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/jumpboxPublicIP"
+ },
+ "subnet": {
+ "id": "networkSettings"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/jumpboxNSG"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "jumpboxVM",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//jumpboxNIC"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "vmSize"
+ },
+ "osProfile": {
+ "computerName": "machineSettingsjumpbox",
+ "adminUsername": "machineSettings",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "machineSettings",
+ "osDisk": {
+ "name": "jumpboxVM_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/jumpboxNIC"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "outputs": {},
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT967 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT967
new file mode 100644
index 0000000..8a3366b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT967
@@ -0,0 +1,195 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/node-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903175,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/node-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT967",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.compute/virtualmachines/extensions"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT967",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "commonSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Common settings object"
+ }
+ },
+ "networkSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Network settings object"
+ }
+ },
+ "machineSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Machine settings object"
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "Description": "Administrator password used when provisioning virtual machines"
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "authenticationType": {
+ "type": "string"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-VNET-NAME"
+ },
+ "subnetName": {
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "addressPrefix": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetPrefix": {
+ "value": "10.0.0.0/24"
+ },
+ "nodeAddressPrefix": {
+ "value": "10.0.0.1"
+ },
+ "redisVersion": {
+ "value": "3.0.0"
+ },
+ "redisClusterName": {
+ "value": "redis-arm-cluster"
+ },
+ "jumpbox": {
+ "value": "Enabled"
+ },
+ "tshirtSize": {
+ "value": "Small"
+ }
+ },
+ "variables": {
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/machineSettings/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nicMembermachineSettings",
+ "apiVersion": "2020-11-01",
+ "location": "location",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Static",
+ "privateIPAddress": "networkSettingsmachineSettings",
+ "subnet": {
+ "id": "networkSettings"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "vmMembermachineSettings",
+ "apiVersion": "2017-03-30",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Network/networkInterfaces//nicMembermachineSettings"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/commonSettings"
+ },
+ "hardwareProfile": {
+ "vmSize": "machineSettings"
+ },
+ "osProfile": {
+ "computerName": "machineSettingsmembermachineSettings",
+ "adminUsername": "machineSettings",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": "machineSettings",
+ "osDisk": {
+ "name": "vmMembermachineSettings_OSDisk",
+ "caching": "ReadWrite",
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/nicMembermachineSettings"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": "vmMembermachineSettings/installscript",
+ "apiVersion": "2020-12-01",
+ "location": "location",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//vmMembermachineSettings"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "fileUris": "machineSettings",
+ "commandToExecute": "machineSettings"
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT968 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT968
new file mode 100644
index 0000000..a729146
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT968
@@ -0,0 +1,125 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/shared-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903184,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-high-availability/shared-resources.json",
+ "/quickstarts/microsoft.cache/redis-high-availability/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT968",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT968",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "commonSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Common settings object"
+ }
+ },
+ "networkSettings": {
+ "type": "object",
+ "metadata": {
+ "Description": "Network settings object"
+ }
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPasswordOrKey": {
+ "value": "GEN-SSH-PUB-KEY"
+ },
+ "virtualNetworkName": {
+ "value": "GEN-VNET-NAME"
+ },
+ "subnetName": {
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "addressPrefix": {
+ "value": "10.0.0.0/16"
+ },
+ "subnetPrefix": {
+ "value": "10.0.0.0/24"
+ },
+ "nodeAddressPrefix": {
+ "value": "10.0.0.1"
+ },
+ "redisVersion": {
+ "value": "3.0.0"
+ },
+ "redisClusterName": {
+ "value": "redis-arm-cluster"
+ },
+ "jumpbox": {
+ "value": "Enabled"
+ },
+ "tshirtSize": {
+ "value": "Small"
+ }
+ },
+ "resources": [
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "commonSettings",
+ "location": "location",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "networkSettings",
+ "location": "location",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "networkSettings"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "networkSettings",
+ "properties": {
+ "addressPrefix": "networkSettings"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT969 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT969
new file mode 100644
index 0000000..60d1af1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT969
@@ -0,0 +1,103 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903192,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT969",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT969",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat('cached',uniqueString(resourceGroup().id))]",
+ "storageAccountName2": "[concat('diags',uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "comments": "Premium Storage account used as Redis Backup storage",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Premium_LRS"
+ },
+ "kind": "Storage",
+ "properties": {
+ "encryption": {
+ "services": {
+ "blob": {
+ "enabled": false
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ }
+ }
+ },
+ {
+ "comments": "Storage account used for storing diagnostic logs",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName2')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ }
+ ],
+ "outputs": {
+ "diagnosticsStorageAccountId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "value": "[variables('storageAccountName')]"
+ },
+ "storageAccountResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT97 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT97
new file mode 100644
index 0000000..cd51d97
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT97
@@ -0,0 +1,832 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/azuredeploy.json",
+ "/application-workloads/cloudera/cloudera-tableau/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962886078,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudera/cloudera-tableau/azuredeploy.json",
+ "/application-workloads/cloudera/cloudera-tableau/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT97",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT97",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.1",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "defaultValue": "azureuser",
+ "metadata": {
+ "description": "Admin user name for the VMs"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "scriptsUri": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau",
+ "metadata": {
+ "descritption": "The location of the templates and resources"
+ },
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password for the VMs (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "cmUsername": {
+ "type": "string",
+ "defaultValue": "cmadmin",
+ "metadata": {
+ "description": "User name for the Cloudera Manager"
+ },
+ "value": "cmadmin"
+ },
+ "cmPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "password for the Cloudera Manager (A mix of upper and lower-case characters, digits and symbols)"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccountPrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique namespace for the Storage Account where the VM disks will be placed (alphahumeric characters only)"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "dnsNamePrefix": {
+ "type": "string",
+ "metadata": {
+ "description": "Unique public DNS name where the VMs will be exposed"
+ },
+ "value": "GEN-UNIQUE-10"
+ },
+ "masterStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Premium_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for master nodes (defaults to Premium_LRS)"
+ },
+ "value": "Premium_LRS"
+ },
+ "workerStorageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "metadata": {
+ "description": "The type of the Storage Account to be created for worker nodes (defaults to Standard_LRS)"
+ },
+ "value": "Standard_LRS"
+ },
+ "virtualNetworkName": {
+ "type": "string",
+ "defaultValue": "clouderavnet",
+ "metadata": {
+ "description": "The name of the virtual network provisioned for the deployment"
+ },
+ "value": "cltabVNet"
+ },
+ "vnetNewOrExisting": {
+ "type": "string",
+ "defaultValue": "new",
+ "allowedValues": [
+ "new",
+ "existing"
+ ],
+ "metadata": {
+ "description": "Indicator for new or exiting Virtual Network"
+ },
+ "value": "new"
+ },
+ "virtualNetworkRGName": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "Resource Group Name for Vnet. For new VNet leave it empty, otherwise type in existing resource group name"
+ },
+ "value": ""
+ },
+ "addressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "Virtual Network address CIDR"
+ },
+ "value": "10.0.0.0/16"
+ },
+ "subnetName": {
+ "type": "string",
+ "defaultValue": "clouderasubnet",
+ "metadata": {
+ "description": "Subnet name for the virtual network where resources will be provisioned"
+ },
+ "value": "clouderasubnet"
+ },
+ "subnetPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.2.0/24",
+ "metadata": {
+ "description": "CIDR for the subnet where VMs will be placed"
+ },
+ "value": "10.0.2.0/24"
+ },
+ "subnet1Name": {
+ "type": "string",
+ "defaultValue": "tableausubnet",
+ "metadata": {
+ "description": "Subnet name for the virtual network where resources will be provisioned"
+ },
+ "value": "tableausubnet"
+ },
+ "subnet1Prefix": {
+ "type": "string",
+ "defaultValue": "10.0.1.0/24",
+ "metadata": {
+ "description": "CIDR for the subnet where VMs will be placed"
+ },
+ "value": "10.0.1.0/24"
+ },
+ "masterNodeIPAddress": {
+ "type": "string",
+ "defaultValue": "10.0.2.4",
+ "metadata": {
+ "description": "IP address for the first master"
+ },
+ "value": "10.0.2.4"
+ },
+ "tableauIPAddress": {
+ "type": "string",
+ "defaultValue": "10.0.1.4",
+ "metadata": {
+ "description": "IP address for the Tableau server"
+ },
+ "value": "10.0.1.4"
+ },
+ "dataNodeIPOffSetFromMaster": {
+ "type": "int",
+ "defaultValue": 5,
+ "metadata": {
+ "description": "IP address from the master node, for example if the first master is 10.1.1.1, then the first dataNode would be 10.1.1.11"
+ },
+ "value": 5
+ },
+ "tshirtSize": {
+ "type": "string",
+ "defaultValue": "Eval",
+ "allowedValues": [
+ "Eval",
+ "Prod"
+ ],
+ "metadata": {
+ "description": "T-shirt size of the Cloudera cluster (Eval, Prod)"
+ },
+ "value": "Eval"
+ },
+ "numberOfDataNodes": {
+ "type": "int",
+ "defaultValue": 3,
+ "metadata": {
+ "description": "Number of data nodes for Prod (defaults to 3)"
+ },
+ "value": 3
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D16s_v3",
+ "metadata": {
+ "description": "The size of the VMs deployed in the cluster (defaults to Standard_DS14)"
+ },
+ "value": "Standard_D16s_v3"
+ },
+ "company": {
+ "type": "string",
+ "defaultValue": "Company",
+ "metadata": {
+ "description": "Your Company"
+ },
+ "value": "Company"
+ },
+ "emailAddress": {
+ "type": "string",
+ "defaultValue": "email@yourcompany.com",
+ "metadata": {
+ "description": "your email"
+ },
+ "value": "someon@somewhere.com"
+ },
+ "businessPhone": {
+ "type": "string",
+ "defaultValue": "123456789",
+ "metadata": {
+ "description": "your business phone number"
+ },
+ "value": "55555555"
+ },
+ "firstName": {
+ "type": "string",
+ "defaultValue": "FirstName",
+ "metadata": {
+ "description": "Your FirstName"
+ },
+ "value": "someone"
+ },
+ "lastName": {
+ "type": "string",
+ "defaultValue": "LastName",
+ "metadata": {
+ "description": "Your LastName"
+ },
+ "value": "Somewhere"
+ },
+ "jobRole": {
+ "type": "string",
+ "defaultValue": "Administrator",
+ "metadata": {
+ "description": "Job Role"
+ },
+ "allowedValues": [
+ "Administrator",
+ "Analyst (Industry/Finance)",
+ "Analyst (Technical)",
+ "Architect",
+ "C level",
+ "Consultant",
+ "Developer",
+ "Director",
+ "Engineer",
+ "Individual contributor",
+ "Manager",
+ "Partner",
+ "Student",
+ "VP"
+ ],
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "type": "string",
+ "defaultValue": "Analytics / Business Intelligence",
+ "metadata": {
+ "description": "Job Function"
+ },
+ "allowedValues": [
+ "Analytics / Business Intelligence",
+ "Big Data / Architecture",
+ "Data Warehouse / Management",
+ "Data Science",
+ "Database",
+ "ETL / ELT",
+ "Infrastructure",
+ "IT",
+ "Marketing / Sales",
+ "Networking",
+ "Manager",
+ "Security / Compliance",
+ "Storage"
+ ],
+ "value": "Infrastructure"
+ }
+ },
+ "variables": {
+ "templateAPIVersion": "2015-11-01",
+ "resourceAPIVersion": "2015-06-15",
+ "installCDH": "True",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.2.0/24",
+ "subnet1Prefix": "10.0.1.0/24",
+ "scriptsUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau",
+ "share-resourcesUri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau/nested/shared-resources-new-vnet.json",
+ "data-nodeUri": "[concat(variables('scriptsUri'), '/nested/data-node-', toLower(subString(parameters('vmSize'), 9, 4)), '.json')]",
+ "sa": "10.0.2.4",
+ "tableau": "10.0.1.4",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterStorageAccount": {
+ "prefix": "GEN-UNIQUE",
+ "type": "Premium_LRS"
+ },
+ "workerStorageAccount": {
+ "prefix": "GEN-UNIQUE",
+ "type": "Standard_LRS"
+ },
+ "clusterTshirtSizeEval": {
+ "masterNodeCount": 1,
+ "dataNodeCount": 3,
+ "highAvailability": "false"
+ },
+ "clusterTshirtSizeProd": {
+ "masterNodeCount": 3,
+ "dataNodeCount": 3,
+ "highAvailability": "true"
+ },
+ "clusterSpec": "concat(clusterTshirtSize, parameters(tshirtSize))",
+ "vmSpec": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS",
+ "tableauASName": "GEN-UNIQUE-10-tsAS"
+ },
+ "networkSpec": {
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.2.0/24",
+ "subnet1Prefix": "10.0.1.0/24",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.0.2.4",
+ "tableauIPAddress": "10.0.1.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "cltabVNet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet",
+ "virtualNetworkSubnet1Name": "tableausubnet"
+ },
+ "newVNetId": "Microsoft.Network/virtualNetworks/cltabVNet",
+ "existingVNetId": "parameters('virtualNetworkRGName')/Microsoft.Network/virtualNetworks/cltabVNet",
+ "VNetId": "concat(parameters(vnetNewOrExisting),VNetId)",
+ "clouderaTags": {
+ "type": "object",
+ "provider": "B33D5D26-DD73-41FC-994A-BD709E8C8488"
+ },
+ "tableauTags": {
+ "type": "object",
+ "provider": "C417510C-A4EC-4E09-8BA4-86DA72BC2F5E"
+ },
+ "quickstartTags": {
+ "type": "object",
+ "name": "cloudera-tableau"
+ }
+ },
+ "resources": [
+ {
+ "name": "shared-resources",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Resources that are shared within the infrastructure environment",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau/nested/shared-resources-new-vnet.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.2.0/24",
+ "subnet1Prefix": "10.0.1.0/24",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.0.2.4",
+ "tableauIPAddress": "10.0.1.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "cltabVNet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet",
+ "virtualNetworkSubnet1Name": "tableausubnet"
+ }
+ },
+ "tableauASName": {
+ "value": "(vmSpec).tableauASName"
+ },
+ "masterNodeASName": {
+ "value": "(vmSpec).masterNodeASName"
+ },
+ "dataNodeASName": {
+ "value": "(vmSpec).dataNodeASName"
+ },
+ "clouderaTags": {
+ "value": {
+ "type": "object",
+ "provider": "B33D5D26-DD73-41FC-994A-BD709E8C8488"
+ }
+ },
+ "tableauTags": {
+ "value": {
+ "type": "object",
+ "provider": "C417510C-A4EC-4E09-8BA4-86DA72BC2F5E"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "cloudera-tableau"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "master-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Cloudera master node that manages the cluster nodes",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau/nested/master-node.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau"
+ },
+ "storageAccount": {
+ "value": {
+ "prefix": "GEN-UNIQUE",
+ "type": "Premium_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).masterNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS",
+ "tableauASName": "GEN-UNIQUE-10-tsAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.2.0/24",
+ "subnet1Prefix": "10.0.1.0/24",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.0.2.4",
+ "tableauIPAddress": "10.0.1.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "cltabVNet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet",
+ "virtualNetworkSubnet1Name": "tableausubnet"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "clouderaTags": {
+ "value": {
+ "type": "object",
+ "provider": "B33D5D26-DD73-41FC-994A-BD709E8C8488"
+ }
+ },
+ "tableauTags": {
+ "value": {
+ "type": "object",
+ "provider": "C417510C-A4EC-4E09-8BA4-86DA72BC2F5E"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "cloudera-tableau"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "data-node",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Cloudera data nodes or cluster members",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "[variables('data-nodeUri')]",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau"
+ },
+ "storageAccount": {
+ "value": {
+ "prefix": "GEN-UNIQUE",
+ "type": "Standard_LRS"
+ }
+ },
+ "vmCount": {
+ "value": "(clusterSpec).dataNodeCount"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS",
+ "tableauASName": "GEN-UNIQUE-10-tsAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.2.0/24",
+ "subnet1Prefix": "10.0.1.0/24",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.0.2.4",
+ "tableauIPAddress": "10.0.1.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "cltabVNet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet",
+ "virtualNetworkSubnet1Name": "tableausubnet"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "clouderaTags": {
+ "value": {
+ "type": "object",
+ "provider": "B33D5D26-DD73-41FC-994A-BD709E8C8488"
+ }
+ },
+ "tableauTags": {
+ "value": {
+ "type": "object",
+ "provider": "C417510C-A4EC-4E09-8BA4-86DA72BC2F5E"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "cloudera-tableau"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "tableau-server",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Tableau Server offering from the Azure market place",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/shared-resources"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau/nested/tableau-server.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "vnetID": {
+ "value": "concat(parameters(vnetNewOrExisting),VNetId)"
+ },
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau"
+ },
+ "storageAccount": {
+ "value": {
+ "prefix": "GEN-UNIQUE",
+ "type": "Premium_LRS"
+ }
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS",
+ "tableauASName": "GEN-UNIQUE-10-tsAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.2.0/24",
+ "subnet1Prefix": "10.0.1.0/24",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.0.2.4",
+ "tableauIPAddress": "10.0.1.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "cltabVNet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet",
+ "virtualNetworkSubnet1Name": "tableausubnet"
+ }
+ },
+ "adminUsername": {
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "clouderaTags": {
+ "value": {
+ "type": "object",
+ "provider": "B33D5D26-DD73-41FC-994A-BD709E8C8488"
+ }
+ },
+ "tableauTags": {
+ "value": {
+ "type": "object",
+ "provider": "C417510C-A4EC-4E09-8BA4-86DA72BC2F5E"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "cloudera-tableau"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "setup-cloudera",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-11-01",
+ "comments": "Scripts and configuration settings that intialize the Cloudera cluster environment",
+ "dependsOn": [
+ "Microsoft.Resources/deployments/data-node",
+ "Microsoft.Resources/deployments/master-node"
+ ],
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau/nested/setup-cloudera.json",
+ "contentVersion": "1.0.0.1"
+ },
+ "parameters": {
+ "resourceAPIVersion": {
+ "value": "2015-06-15"
+ },
+ "dnsNamePrefix": {
+ "value": "GEN-UNIQUE-10"
+ },
+ "scriptsUri": {
+ "value": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/cloudera-tableau"
+ },
+ "vmSpec": {
+ "value": {
+ "vmSize": "Standard_D16s_v3",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "masterNodeASName": "GEN-UNIQUE-10-mnAS",
+ "dataNodeASName": "GEN-UNIQUE-10-dnAS",
+ "tableauASName": "GEN-UNIQUE-10-tsAS"
+ }
+ },
+ "networkSpec": {
+ "value": {
+ "addressPrefix": "10.0.0.0/16",
+ "subnetPrefix": "10.0.2.0/24",
+ "subnet1Prefix": "10.0.1.0/24",
+ "ipOctet01": "[concat(split(variables('sa'), '.')[0], '.', split(variables('sa'), '.')[1], '.')]",
+ "ipOctet2": "[int(split(variables('sa'), '.')[2])]",
+ "ipOctet3": "[int(split(variables('sa'), '.')[3])]",
+ "datanodeIpOctet3": "[add(int(split(variables('sa'), '.')[3]), parameters('dataNodeIPOffSetFromMaster'))]",
+ "masterIP": "10.0.2.4",
+ "tableauIPAddress": "10.0.1.4",
+ "workerIP": "[concat(variables('ipOctet01'), add(variables('ipOctet2'), div(variables('datanodeIpOctet3'), 255)), '.', mod(variables('datanodeIpOctet3'), 255))]",
+ "virtualNetworkName": "cltabVNet",
+ "virtualNetworkRGName": "",
+ "vnetNewOrExisting": "new",
+ "virtualNetworkSubnetName": "clouderasubnet",
+ "virtualNetworkSubnet1Name": "tableausubnet"
+ }
+ },
+ "clusterSpec": {
+ "value": "concat(clusterTshirtSize, parameters(tshirtSize))"
+ },
+ "fqdn": {
+ "value": "[reference('master-node').outputs.fqdn.value]"
+ },
+ "cmUsername": {
+ "value": "cmadmin"
+ },
+ "cmPassword": {
+ "value": "GEN-PASSWORD"
+ },
+ "company": {
+ "value": "Company"
+ },
+ "emailAddress": {
+ "value": "someon@somewhere.com"
+ },
+ "businessPhone": {
+ "value": "55555555"
+ },
+ "firstName": {
+ "value": "someone"
+ },
+ "lastName": {
+ "value": "Somewhere"
+ },
+ "jobRole": {
+ "value": "Administrator"
+ },
+ "jobFunction": {
+ "value": "Infrastructure"
+ },
+ "installCDH": {
+ "value": "True"
+ },
+ "clouderaTags": {
+ "value": {
+ "type": "object",
+ "provider": "B33D5D26-DD73-41FC-994A-BD709E8C8488"
+ }
+ },
+ "tableauTags": {
+ "value": {
+ "type": "object",
+ "provider": "C417510C-A4EC-4E09-8BA4-86DA72BC2F5E"
+ }
+ },
+ "quickstartTags": {
+ "value": {
+ "type": "object",
+ "name": "cloudera-tableau"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT970 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT970
new file mode 100644
index 0000000..d36982c
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT970
@@ -0,0 +1,159 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903199,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-cluster-diagnostics/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT970",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cache/redis",
+ "microsoft.insights/diagnosticsettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT970",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1.14562",
+ "templateHash": "13872689946402645874"
+ }
+ },
+ "parameters": {
+ "redisCacheName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of the Azure Redis Cache to create."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location of all resources"
+ }
+ },
+ "redisCacheSKU": {
+ "type": "string",
+ "defaultValue": "Premium",
+ "allowedValues": [
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Specify the pricing tier of the new Azure Redis Cache."
+ }
+ },
+ "redisCacheFamily": {
+ "type": "string",
+ "defaultValue": "P",
+ "allowedValues": [
+ "C",
+ "P"
+ ],
+ "metadata": {
+ "description": "Specify the family for the sku. C = Basic/Standard, P = Premium."
+ }
+ },
+ "redisCacheCapacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "metadata": {
+ "description": "Specify the size of the new Azure Redis Cache instance. Valid values: for C (Basic/Standard) family (0, 1, 2, 3, 4, 5, 6), for P (Premium) family (1, 2, 3, 4)"
+ }
+ },
+ "enableNonSslPort": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Set to true to allow access to redis on port 6379, without SSL tunneling (less secure)."
+ }
+ },
+ "diagnosticsEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specify a boolean value that indicates whether diagnostics should be saved to the specified storage account."
+ }
+ },
+ "existingDiagnosticsStorageAccountId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify an existing storage account for diagnostics. Must be in the same subscription."
+ },
+ "value": "GET-PREREQ-diagnosticsStorageAccountId"
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cache/redis",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "enableNonSslPort": false,
+ "minimumTlsVersion": "1.2",
+ "sku": {
+ "capacity": 1,
+ "family": "P",
+ "name": "Premium"
+ }
+ }
+ },
+ {
+ "type": "microsoft.insights/diagnosticSettings",
+ "apiVersion": "2017-05-01-preview",
+ "scope": "[format('Microsoft.Cache/redis/{0}', parameters('redisCacheName'))]",
+ "name": "GEN-UNIQUE",
+ "properties": {
+ "storageAccountId": "GET-PREREQ-diagnosticsStorageAccountId",
+ "metrics": [
+ {
+ "timeGrain": "AllMetrics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": true
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Cache/redis/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT971 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT971
new file mode 100644
index 0000000..e8ef946
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT971
@@ -0,0 +1,103 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-persistence/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-persistence/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903208,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-persistence/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-persistence/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT971",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT971",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "variables": {
+ "storageAccountName": "[concat('cached',uniqueString(resourceGroup().id))]",
+ "storageAccountName2": "[concat('diags',uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "comments": "Premium Storage account used as Redis Backup storage",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName')]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Premium_LRS"
+ },
+ "kind": "Storage",
+ "properties": {
+ "encryption": {
+ "services": {
+ "blob": {
+ "enabled": false
+ }
+ },
+ "keySource": "Microsoft.Storage"
+ }
+ }
+ },
+ {
+ "comments": "Storage account used for storing diagnostic logs",
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('storageAccountName2')]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "Storage Account"
+ },
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ }
+ ],
+ "outputs": {
+ "diagnosticsStorageAccountId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "value": "[variables('storageAccountName')]"
+ },
+ "storageAccountResourceGroup": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT972 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT972
new file mode 100644
index 0000000..e1b0d4a
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT972
@@ -0,0 +1,172 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-persistence/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-persistence/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903216,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-persistence/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-persistence/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT972",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cache/redis",
+ "microsoft.insights/diagnosticsettings"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT972",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.412.5873",
+ "templateHash": "13947652606587246763"
+ }
+ },
+ "parameters": {
+ "redisCacheName": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify the name of the Azure Redis Cache to create."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the storage account."
+ },
+ "value": "GET-PREREQ-storageAccountName"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The location of the Redis Cache. For best performance, use the same location as the app to be used with the cache."
+ }
+ },
+ "redisCacheSKU": {
+ "type": "string",
+ "defaultValue": "Premium",
+ "allowedValues": [
+ "Basic",
+ "Standard",
+ "Premium"
+ ],
+ "metadata": {
+ "description": "Specify the pricing tier of the new Azure Redis Cache."
+ }
+ },
+ "redisCacheFamily": {
+ "type": "string",
+ "defaultValue": "P",
+ "allowedValues": [
+ "C",
+ "P"
+ ],
+ "metadata": {
+ "description": "Specify the family for the sku. C = Basic/Standard, P = Premium"
+ }
+ },
+ "redisCacheCapacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "metadata": {
+ "description": "Specify the size of the new Azure Redis Cache instance. Valid values: for C (Basic/Standard) family (0, 1, 2, 3, 4, 5, 6), for P (Premium) family (1, 2, 3, 4)"
+ }
+ },
+ "enableNonSslPort": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Specify a boolean value that indicates whether to allow access via non-SSL ports."
+ }
+ },
+ "diagnosticsEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Specify a boolean value that indicates whether diagnostics should be saved to the specified storage account."
+ }
+ },
+ "existingDiagnosticsStorageAccountId": {
+ "type": "string",
+ "metadata": {
+ "description": "Specify an existing storage account for diagnostics."
+ },
+ "value": "GET-PREREQ-diagnosticsStorageAccountId"
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cache/redis",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "enableNonSslPort": false,
+ "minimumTlsVersion": "1.2",
+ "sku": {
+ "capacity": 1,
+ "family": "P",
+ "name": "Premium"
+ },
+ "redisConfiguration": {
+ "rdb-backup-enabled": "true",
+ "rdb-backup-frequency": "60",
+ "rdb-backup-max-snapshot-count": "1",
+ "rdb-storage-connection-string": "[format('DefaultEndpointsProtocol=https;BlobEndpoint=https://{0}.blob.{1};AccountName={2};AccountKey={3}', parameters('storageAccountName'), environment().suffixes.storage, parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[0].value)]"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Insights/diagnosticSettings",
+ "apiVersion": "2021-05-01-preview",
+ "scope": "[format('Microsoft.Cache/redis/{0}', parameters('redisCacheName'))]",
+ "name": "GEN-UNIQUE",
+ "properties": {
+ "storageAccountId": "GET-PREREQ-diagnosticsStorageAccountId",
+ "metrics": [
+ {
+ "timeGrain": "AllMetrics",
+ "enabled": true,
+ "retentionPolicy": {
+ "days": 90,
+ "enabled": true
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Cache/redis/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT973 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT973
new file mode 100644
index 0000000..289d470
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT973
@@ -0,0 +1,132 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-vnet/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-vnet/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903223,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-premium-vnet/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-premium-vnet/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT973",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cache/redis"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT973",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "7605655404309623089"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The location of the existing Virtual Network and for the new Redis Cache."
+ }
+ },
+ "redisCacheName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the Azure Redis Cache to create."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "redisCacheCapacity": {
+ "type": "int",
+ "defaultValue": 1,
+ "allowedValues": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "metadata": {
+ "description": "The size of the new Azure Redis Cache instance. Valid capacity combinations are (P1..P5)."
+ }
+ },
+ "existingVirtualNetworkResourceGroupName": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().name]",
+ "metadata": {
+ "description": "The resource group of the existing Virtual Network."
+ },
+ "value": "GEN-VNET-RESOURCEGROUP-NAME"
+ },
+ "existingVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the existing Virtual Network."
+ },
+ "value": "GEN-VNET-NAME"
+ },
+ "existingSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the existing subnet."
+ },
+ "value": "GEN-VNET-SUBNET1-NAME"
+ },
+ "enableNonSslPort": {
+ "type": "bool",
+ "defaultValue": false,
+ "metadata": {
+ "description": "Set to true to allow access to redis on port 6379, without SSL tunneling (less secure)."
+ }
+ },
+ "minimumTlsVersion": {
+ "type": "string",
+ "defaultValue": "1.2",
+ "allowedValues": [
+ "1.0",
+ "1.1",
+ "1.2"
+ ],
+ "metadata": {
+ "description": "The minimum allowed TLS version."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cache/redis",
+ "apiVersion": "2020-12-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "enableNonSslPort": false,
+ "minimumTlsVersion": "1.2",
+ "sku": {
+ "capacity": 1,
+ "family": "P",
+ "name": "Premium"
+ },
+ "subnetId": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('existingVirtualNetworkResourceGroupName')), 'Microsoft.Network/virtualNetworks/subnets', split(format('{0}/{1}', parameters('existingVirtualNetworkName'), parameters('existingSubnetName')), '/')[0], split(format('{0}/{1}', parameters('existingVirtualNetworkName'), parameters('existingSubnetName')), '/')[1])]"
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT974 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT974
new file mode 100644
index 0000000..631400d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT974
@@ -0,0 +1,407 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903228,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT974",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/connections",
+ "microsoft.network/virtualnetworkgateways"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT974",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The location of the primary virtual network."
+ },
+ "value": "westus"
+ },
+ "primaryVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary virtual network."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryCacheSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary cache subnet."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryVirtualNetworkAddressSpace": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "The address space of the new primary virtual network."
+ }
+ },
+ "primaryCacheSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "The address prefix of the new primary cache subnet."
+ }
+ },
+ "primaryGatewaySubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.255.224/27",
+ "metadata": {
+ "description": "The address prefix of the new primary gateway subnet. Must be at least /29"
+ }
+ },
+ "primaryGatewayPublicIPAddressName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary gateway public IP address."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryGatewayName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary gateway."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryGatewayConnectionName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary gateway connection."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of the secondary virtual network."
+ },
+ "value": "eastus"
+ },
+ "secondaryVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary virtual network."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryCacheSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary cache subnet."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryVirtualNetworkAddressSpace": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/16",
+ "metadata": {
+ "description": "The address space of the new secondary virtual network."
+ }
+ },
+ "secondaryCacheSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/24",
+ "metadata": {
+ "description": "The address prefix of the new secondary cache subnet."
+ }
+ },
+ "secondaryGatewaySubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.255.224/27",
+ "metadata": {
+ "description": "The address prefix of the new secondary gateway subnet. Must be at least /29"
+ }
+ },
+ "secondaryGatewayPublicIPAddressName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary gateway public IP address."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryGatewayName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary gateway."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryGatewayConnectionName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary gateway connection."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "gatewaySharedKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "A mixture of letters and numbers. The shared key (PSK) is used to establish encryption for the virtual network gateway connection."
+ },
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "variables": {
+ "gatewaySubnetName": "GatewaySubnet"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "westus",
+ "comments": "Create a virtual network in the primary location.",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ },
+ {
+ "name": "GatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.0.255.224/27"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "eastus",
+ "comments": "Create a virtual network in the secondary location.",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.1.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE",
+ "properties": {
+ "addressPrefix": "10.1.0.0/24"
+ }
+ },
+ {
+ "name": "GatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.1.255.224/27"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "westus",
+ "comments": "Create a public IP address for the primary virtual network gateway.",
+ "sku": {
+ "name": "Basic"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "publicIPAddressVersion": "IPv4"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "eastus",
+ "comments": "Create a public IP address for the secondary virtual network gateway.",
+ "sku": {
+ "name": "Basic"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "publicIPAddressVersion": "IPv4"
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworkGateways",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "westus",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway for the primary virtual network.",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "default",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE/GatewaySubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "gatewayType": "Vpn",
+ "vpnType": "RouteBased",
+ "sku": {
+ "name": "VpnGw1",
+ "tier": "VpnGw1"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworkGateways",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "eastus",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway for the secondary virtual network.",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "default",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE/GatewaySubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "gatewayType": "Vpn",
+ "vpnType": "RouteBased",
+ "sku": {
+ "name": "VpnGw1",
+ "tier": "VpnGw1"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/connections",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "westus",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway connection from the primary gateway to the secondary gateway.",
+ "properties": {
+ "virtualNetworkGateway1": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "virtualNetworkGateway2": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "connectionType": "Vnet2Vnet",
+ "connectionProtocol": "IKEv2",
+ "sharedKey": "GEN-UNIQUE"
+ }
+ },
+ {
+ "type": "Microsoft.Network/connections",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "eastus",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway connection from the secondary gateway to the primary gateway.",
+ "properties": {
+ "virtualNetworkGateway1": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "virtualNetworkGateway2": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "connectionType": "Vnet2Vnet",
+ "connectionProtocol": "IKEv2",
+ "sharedKey": "GEN-UNIQUE"
+ }
+ }
+ ],
+ "outputs": {
+ "existingPrimaryVirtualNetworkLocation": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ },
+ "existingPrimaryVirtualNetworkResourceGroupName": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingPrimaryVirtualNetworkName": {
+ "type": "string",
+ "value": "[parameters('primaryVirtualNetworkName')]"
+ },
+ "existingPrimaryCacheSubnetName": {
+ "type": "string",
+ "value": "[parameters('primaryCacheSubnetName')]"
+ },
+ "existingSecondaryVirtualNetworkLocation": {
+ "type": "string",
+ "value": "[parameters('secondaryLocation')]"
+ },
+ "existingSecondaryVirtualNetworkResourceGroupName": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingSecondaryVirtualNetworkName": {
+ "type": "string",
+ "value": "[parameters('secondaryVirtualNetworkName')]"
+ },
+ "existingSecondaryCacheSubnetName": {
+ "type": "string",
+ "value": "[parameters('secondaryCacheSubnetName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT975 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT975
new file mode 100644
index 0000000..43f17e4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT975
@@ -0,0 +1,407 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962903236,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/prereqs/prereq.azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT975",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/connections",
+ "microsoft.network/virtualnetworkgateways"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT975",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The location of the primary virtual network."
+ },
+ "value": "usgovvirginia"
+ },
+ "primaryVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary virtual network."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryCacheSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary cache subnet."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryVirtualNetworkAddressSpace": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/16",
+ "metadata": {
+ "description": "The address space of the new primary virtual network."
+ }
+ },
+ "primaryCacheSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.0.0/24",
+ "metadata": {
+ "description": "The address prefix of the new primary cache subnet."
+ }
+ },
+ "primaryGatewaySubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.0.255.224/27",
+ "metadata": {
+ "description": "The address prefix of the new primary gateway subnet. Must be at least /29"
+ }
+ },
+ "primaryGatewayPublicIPAddressName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary gateway public IP address."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryGatewayName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary gateway."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "primaryGatewayConnectionName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary gateway connection."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of the secondary virtual network."
+ },
+ "value": "usgovtexas"
+ },
+ "secondaryVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary virtual network."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryCacheSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary cache subnet."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryVirtualNetworkAddressSpace": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/16",
+ "metadata": {
+ "description": "The address space of the new secondary virtual network."
+ }
+ },
+ "secondaryCacheSubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.0.0/24",
+ "metadata": {
+ "description": "The address prefix of the new secondary cache subnet."
+ }
+ },
+ "secondaryGatewaySubnetAddressPrefix": {
+ "type": "string",
+ "defaultValue": "10.1.255.224/27",
+ "metadata": {
+ "description": "The address prefix of the new secondary gateway subnet. Must be at least /29"
+ }
+ },
+ "secondaryGatewayPublicIPAddressName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary gateway public IP address."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryGatewayName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary gateway."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryGatewayConnectionName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary gateway connection."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "gatewaySharedKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "A mixture of letters and numbers. The shared key (PSK) is used to establish encryption for the virtual network gateway connection."
+ },
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "variables": {
+ "gatewaySubnetName": "GatewaySubnet"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovvirginia",
+ "comments": "Create a virtual network in the primary location.",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ },
+ {
+ "name": "GatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.0.255.224/27"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovtexas",
+ "comments": "Create a virtual network in the secondary location.",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.1.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "GEN-UNIQUE",
+ "properties": {
+ "addressPrefix": "10.1.0.0/24"
+ }
+ },
+ {
+ "name": "GatewaySubnet",
+ "properties": {
+ "addressPrefix": "10.1.255.224/27"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovvirginia",
+ "comments": "Create a public IP address for the primary virtual network gateway.",
+ "sku": {
+ "name": "Basic"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "publicIPAddressVersion": "IPv4"
+ }
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovtexas",
+ "comments": "Create a public IP address for the secondary virtual network gateway.",
+ "sku": {
+ "name": "Basic"
+ },
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "publicIPAddressVersion": "IPv4"
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworkGateways",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway for the primary virtual network.",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "default",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE/GatewaySubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "gatewayType": "Vpn",
+ "vpnType": "RouteBased",
+ "sku": {
+ "name": "VpnGw1",
+ "tier": "VpnGw1"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworkGateways",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway for the secondary virtual network.",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "default",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/GEN-UNIQUE/GatewaySubnet"
+ },
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "gatewayType": "Vpn",
+ "vpnType": "RouteBased",
+ "sku": {
+ "name": "VpnGw1",
+ "tier": "VpnGw1"
+ }
+ }
+ },
+ {
+ "type": "Microsoft.Network/connections",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovvirginia",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway connection from the primary gateway to the secondary gateway.",
+ "properties": {
+ "virtualNetworkGateway1": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "virtualNetworkGateway2": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "connectionType": "Vnet2Vnet",
+ "connectionProtocol": "IKEv2",
+ "sharedKey": "GEN-UNIQUE"
+ }
+ },
+ {
+ "type": "Microsoft.Network/connections",
+ "apiVersion": "2018-08-01",
+ "name": "GEN-UNIQUE",
+ "location": "usgovtexas",
+ "dependsOn": [
+ "GEN-UNIQUE",
+ "GEN-UNIQUE"
+ ],
+ "comments": "Create a virtual network gateway connection from the secondary gateway to the primary gateway.",
+ "properties": {
+ "virtualNetworkGateway1": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "virtualNetworkGateway2": {
+ "id": "Microsoft.Network/virtualNetworkGateways/GEN-UNIQUE"
+ },
+ "connectionType": "Vnet2Vnet",
+ "connectionProtocol": "IKEv2",
+ "sharedKey": "GEN-UNIQUE"
+ }
+ }
+ ],
+ "outputs": {
+ "existingPrimaryVirtualNetworkLocation": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ },
+ "existingPrimaryVirtualNetworkResourceGroupName": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingPrimaryVirtualNetworkName": {
+ "type": "string",
+ "value": "[parameters('primaryVirtualNetworkName')]"
+ },
+ "existingPrimaryCacheSubnetName": {
+ "type": "string",
+ "value": "[parameters('primaryCacheSubnetName')]"
+ },
+ "existingSecondaryVirtualNetworkLocation": {
+ "type": "string",
+ "value": "[parameters('secondaryLocation')]"
+ },
+ "existingSecondaryVirtualNetworkResourceGroupName": {
+ "type": "string",
+ "value": "[resourceGroup().name]"
+ },
+ "existingSecondaryVirtualNetworkName": {
+ "type": "string",
+ "value": "[parameters('secondaryVirtualNetworkName')]"
+ },
+ "existingSecondaryCacheSubnetName": {
+ "type": "string",
+ "value": "[parameters('secondaryCacheSubnetName')]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT976 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT976
new file mode 100644
index 0000000..5dabb95
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT976
@@ -0,0 +1,186 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903244,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/azuredeploy.json",
+ "/quickstarts/microsoft.cache/redis-vnet-geo-replication/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT976",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cache/redis/linkedservers",
+ "microsoft.cache/redis"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT976",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "The location of the existing primary virtual network and new primary cache."
+ },
+ "value": "GET-PREREQ-existingPrimaryVirtualNetworkLocation"
+ },
+ "existingPrimaryVirtualNetworkResourceGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the resource group of the existing primary virtual network."
+ },
+ "value": "GET-PREREQ-existingPrimaryVirtualNetworkResourceGroupName"
+ },
+ "existingPrimaryVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the existing primary virtual network."
+ },
+ "value": "GET-PREREQ-existingPrimaryVirtualNetworkName"
+ },
+ "existingPrimaryCacheSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the existing primary cache subnet."
+ },
+ "value": "GET-PREREQ-existingPrimaryCacheSubnetName"
+ },
+ "newPrimaryCacheName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new primary cache."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "secondaryLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The location of the existing secondary virtual network and new secondary cache."
+ },
+ "value": "GET-PREREQ-existingSecondaryVirtualNetworkLocation"
+ },
+ "existingSecondaryVirtualNetworkResourceGroupName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the resource group of the existing secondary virtual network."
+ },
+ "value": "GET-PREREQ-existingSecondaryVirtualNetworkResourceGroupName"
+ },
+ "existingSecondaryVirtualNetworkName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the existing secondary virtual network."
+ },
+ "value": "GET-PREREQ-existingSecondaryVirtualNetworkName"
+ },
+ "existingSecondaryCacheSubnetName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the existing secondary cache subnet."
+ },
+ "value": "GET-PREREQ-existingSecondaryCacheSubnetName"
+ },
+ "newSecondaryCacheName": {
+ "type": "string",
+ "metadata": {
+ "description": "The name of the new secondary cache."
+ },
+ "value": "GEN-UNIQUE"
+ }
+ },
+ "variables": {
+ "primarySubnetId": "GET-PREREQ-existingPrimaryVirtualNetworkResourceGroupName/Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-existingPrimaryVirtualNetworkName/GET-PREREQ-existingPrimaryCacheSubnetName",
+ "secondarySubnetId": "GET-PREREQ-existingSecondaryVirtualNetworkResourceGroupName/Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-existingSecondaryVirtualNetworkName/GET-PREREQ-existingSecondaryCacheSubnetName"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Cache/Redis",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "GET-PREREQ-existingPrimaryVirtualNetworkLocation",
+ "properties": {
+ "sku": {
+ "name": "Premium",
+ "family": "P",
+ "capacity": 1
+ },
+ "subnetId": "GET-PREREQ-existingPrimaryVirtualNetworkResourceGroupName/Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-existingPrimaryVirtualNetworkName/GET-PREREQ-existingPrimaryCacheSubnetName"
+ },
+ "comments": "Create a Premium cache in the primary location in the primary virtual network."
+ },
+ {
+ "type": "Microsoft.Cache/Redis",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE",
+ "location": "GET-PREREQ-existingSecondaryVirtualNetworkLocation",
+ "comments": "Create a Premium cache in the secondary location in the secondary virtual network.",
+ "properties": {
+ "sku": {
+ "name": "Premium",
+ "family": "P",
+ "capacity": 1
+ },
+ "subnetId": "GET-PREREQ-existingSecondaryVirtualNetworkResourceGroupName/Microsoft.Network/virtualNetworks/subnets/GET-PREREQ-existingSecondaryVirtualNetworkName/GET-PREREQ-existingSecondaryCacheSubnetName"
+ }
+ },
+ {
+ "type": "Microsoft.Cache/Redis/linkedServers",
+ "apiVersion": "2020-06-01",
+ "name": "GEN-UNIQUE/GEN-UNIQUE",
+ "dependsOn": [
+ "Microsoft.Cache/redis/GEN-UNIQUE",
+ "Microsoft.Cache/redis/GEN-UNIQUE"
+ ],
+ "comments": "Create a geo-replication link. This resource is created as a nested resource of the primary cache. Its name is fixed and cannot be changed. Its properties identifies the secondary cache and labels it as the secondary.",
+ "properties": {
+ "linkedRedisCacheId": "Microsoft.Cache/Redis/GEN-UNIQUE",
+ "linkedRedisCacheLocation": "GET-PREREQ-existingSecondaryVirtualNetworkLocation",
+ "serverRole": "Secondary"
+ }
+ }
+ ],
+ "outputs": {
+ "primaryLocation": {
+ "type": "string",
+ "value": "[parameters('location')]"
+ },
+ "existingPrimaryCacheSubnetId": {
+ "type": "string",
+ "value": "[variables('primarySubnetId')]"
+ },
+ "newPrimaryCacheId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Cache/Redis', parameters('newPrimaryCacheName'))]"
+ },
+ "secondaryLocation": {
+ "type": "string",
+ "value": "[parameters('secondaryLocation')]"
+ },
+ "existingSecondaryCacheSubnetId": {
+ "type": "string",
+ "value": "[variables('secondarySubnetId')]"
+ },
+ "newSecondaryCacheId": {
+ "type": "string",
+ "value": "[resourceId('Microsoft.Cache/Redis', parameters('newSecondaryCacheName'))]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT977 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT977
new file mode 100644
index 0000000..ee5ed57
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT977
@@ -0,0 +1,186 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-customize/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-customize/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903251,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-customize/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-customize/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT977",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT977",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "791031051301333646"
+ }
+ },
+ "parameters": {
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Verizon",
+ "Premium_Verizon",
+ "Custom_Verizon",
+ "Standard_Akamai",
+ "Standard_ChinaCdn",
+ "Standard_Microsoft",
+ "Premium_ChinaCdn",
+ "Standard_AzureFrontDoor",
+ "Premium_AzureFrontDoor",
+ "Standard_955BandWidth_ChinaCdn",
+ "Standard_AvgBandWidth_ChinaCdn",
+ "StandardPlus_ChinaCdn",
+ "StandardPlus_955BandWidth_ChinaCdn",
+ "StandardPlus_AvgBandWidth_ChinaCdn"
+ ],
+ "metadata": {
+ "description": "Pricing tier of the CDN Profile."
+ },
+ "value": "Standard_Microsoft"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "isHttpAllowed": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Whether the HTTP traffic is allowed."
+ },
+ "value": true
+ },
+ "isHttpsAllowed": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Whether the HTTPS traffic is allowed."
+ },
+ "value": true
+ },
+ "queryStringCachingBehavior": {
+ "type": "string",
+ "defaultValue": "IgnoreQueryString",
+ "allowedValues": [
+ "IgnoreQueryString",
+ "BypassCaching",
+ "UseQueryString"
+ ],
+ "metadata": {
+ "description": "Query string caching behavior."
+ },
+ "value": "IgnoreQueryString"
+ },
+ "contentTypesToCompress": {
+ "type": "array",
+ "defaultValue": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "metadata": {
+ "description": "Content type that is compressed."
+ },
+ "value": []
+ },
+ "isCompressionEnabled": {
+ "type": "bool",
+ "defaultValue": true,
+ "metadata": {
+ "description": "Whether the compression is enabled"
+ },
+ "value": false
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "global",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "global",
+ "properties": {},
+ "sku": {
+ "name": "Standard_Microsoft"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-09-01",
+ "name": "[format('{0}/{1}', parameters('profileName'), parameters('endpointName'))]",
+ "location": "global",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [],
+ "isCompressionEnabled": false,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT978 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT978
new file mode 100644
index 0000000..facf9be
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT978
@@ -0,0 +1,165 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-custom-origin/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-custom-origin/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903256,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-custom-origin/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-custom-origin/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT978",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT978",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "5054081787892083176"
+ }
+ },
+ "parameters": {
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint, must be unique"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "CDNSku": {
+ "type": "string",
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Akamai",
+ "Standard_Microsoft",
+ "Standard_Verizon",
+ "Premium_Verizon"
+ ],
+ "metadata": {
+ "description": "CDN SKU names"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-04-15",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_Microsoft"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-04-15",
+ "name": "[format('{0}/{1}', parameters('profileName'), parameters('endpointName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "application/eot",
+ "application/font",
+ "application/font-sfnt",
+ "application/javascript",
+ "application/json",
+ "application/opentype",
+ "application/otf",
+ "application/pkcs7-mime",
+ "application/truetype",
+ "application/ttf",
+ "application/vnd.ms-fontobject",
+ "application/xhtml+xml",
+ "application/xml",
+ "application/xml+rss",
+ "application/x-font-opentype",
+ "application/x-font-truetype",
+ "application/x-font-ttf",
+ "application/x-httpd-cgi",
+ "application/x-javascript",
+ "application/x-mpegurl",
+ "application/x-opentype",
+ "application/x-otf",
+ "application/x-perl",
+ "application/x-ttf",
+ "font/eot",
+ "font/ttf",
+ "font/otf",
+ "font/opentype",
+ "image/svg+xml",
+ "text/css",
+ "text/csv",
+ "text/html",
+ "text/javascript",
+ "text/js",
+ "text/plain",
+ "text/richtext",
+ "text/tab-separated-values",
+ "text/xml",
+ "text/x-script",
+ "text/x-component",
+ "text/x-java-source"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT979 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT979
new file mode 100644
index 0000000..136b5a4
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT979
@@ -0,0 +1,161 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-cacheoverride/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-cacheoverride/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903265,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-cacheoverride/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-cacheoverride/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT979",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT979",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "9572823252393997430"
+ }
+ },
+ "parameters": {
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "CDNSku": {
+ "type": "string",
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Akamai",
+ "Standard_Verizon",
+ "Premium_Verizon",
+ "Standard_Microsoft"
+ ],
+ "metadata": {
+ "description": "CDN SKU names"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_Microsoft"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-09-01",
+ "name": "[format('{0}/{1}', parameters('profileName'), parameters('endpointName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ],
+ "deliveryPolicy": {
+ "description": "Path based Cache Override",
+ "rules": [
+ {
+ "name": "Pathmatchcondition",
+ "order": 1,
+ "conditions": [
+ {
+ "name": "UrlPath",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleUrlPathMatchConditionParameters",
+ "operator": "BeginsWith",
+ "matchValues": [
+ "/images/"
+ ]
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "CacheExpiration",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleCacheExpirationActionParameters",
+ "cacheBehavior": "Override",
+ "cacheType": "All",
+ "cacheDuration": "00:00:30"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT98 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT98
new file mode 100644
index 0000000..c716e8d
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT98
@@ -0,0 +1,479 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudlens/cloudlens-moloch-ubuntu/azuredeploy.json",
+ "/application-workloads/cloudlens/cloudlens-moloch-ubuntu/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962886316,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudlens/cloudlens-moloch-ubuntu/azuredeploy.json",
+ "/application-workloads/cloudlens/cloudlens-moloch-ubuntu/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT98",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT98",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "cloudlensProjectKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The CloudLens Project Key. Used by the agents to connect back to the backend."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "toolVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "The vm size where Moloch will be deployed"
+ }
+ },
+ "toolVmName": {
+ "type": "string",
+ "defaultValue": "MolochTool",
+ "metadata": {
+ "description": "The name of the vm where Moloch will be deployed"
+ }
+ },
+ "tapVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "The vm size where the tap will be deployed"
+ }
+ },
+ "tapVmName": {
+ "type": "string",
+ "defaultValue": "CloudLensTap",
+ "metadata": {
+ "description": "The name of the vm where the tap will be deployed"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressType": "Dynamic",
+ "virtualNetworkName": "CloudLensVNET",
+ "ubuntuOSVersion": "16.04.0-LTS",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/CloudLensVNET/Subnet",
+ "toolPublicIPAddressName": "molochPublicIP",
+ "toolStorageAccountName": "[concat('tooldisk', uniquestring(resourceGroup().id))]",
+ "toolDnsLabelPrefix": "[concat('moloch-',uniquestring(resourceGroup().id))]",
+ "toolNicName": "MolochVMNic",
+ "tapPublicIPAddressName": "cloudlensPublicIP",
+ "tapStorageAccountName": "[concat('tapdisk', uniquestring(resourceGroup().id))]",
+ "tapDnsLabelPrefix": "[concat('cloudlens-',uniquestring(resourceGroup().id))]",
+ "tapNicName": "CloudLensVMNic",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('toolStorageAccountName')]",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('tapStorageAccountName')]",
+ "apiVersion": "2021-04-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "molochPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[variables('toolDnsLabelPrefix')]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "cloudlensPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[variables('tapDnsLabelPrefix')]"
+ }
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-07-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-22",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "CloudLensVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "MolochVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//molochPublicIP",
+ "Microsoft.Network/virtualNetworks//CloudLensVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/molochPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/CloudLensVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "CloudLensVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//cloudlensPublicIP",
+ "Microsoft.Network/virtualNetworks//CloudLensVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/cloudlensPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/CloudLensVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "MolochTool",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('toolStorageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('toolNicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "MolochTool",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04.0-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": 1023,
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/MolochVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('toolStorageAccountName'), '2021-04-01').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "CloudLensTap",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('tapStorageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('tapNicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "CloudLensTap",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04.0-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": 1023,
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/CloudLensVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('tapStorageAccountName'), '2021-04-01').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "name": "MolochTool/config",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//MolochTool"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "skipDos2Unix": false,
+ "timestamp": 123456789
+ },
+ "protectedSettings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/setup-moloch.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "./setup-moloch.sh GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "name": "CloudLensTap/config",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//CloudLensTap"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "skipDos2Unix": false,
+ "timestamp": 123456789
+ },
+ "protectedSettings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/setup-tap.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "./setup-tap.sh GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "Moloch SSH Command": {
+ "type": "string",
+ "value": "[concat('ssh ', parameters('adminUsername'), '@', reference(variables('toolPublicIPAddressName')).dnsSettings.fqdn)]"
+ },
+ "Moloch Host Name": {
+ "type": "string",
+ "value": "[reference(variables('toolPublicIPAddressName')).dnsSettings.fqdn]"
+ },
+ "Tapping Host SSH Command": {
+ "type": "string",
+ "value": "[concat('ssh ', parameters('adminUsername'), '@', reference(variables('tapPublicIPAddressName')).dnsSettings.fqdn)]"
+ },
+ "Tapping Host Name": {
+ "type": "string",
+ "value": "[reference(variables('tapPublicIPAddressName')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT980 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT980
new file mode 100644
index 0000000..0621d2e
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT980
@@ -0,0 +1,215 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-responseheader/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-responseheader/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903273,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-responseheader/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-responseheader/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT980",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT980",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "5456846818766199611"
+ }
+ },
+ "parameters": {
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "CDNSku": {
+ "type": "string",
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Akamai",
+ "Standard_Verizon",
+ "Premium_Verizon",
+ "Standard_Microsoft"
+ ],
+ "metadata": {
+ "description": "CDN SKU names"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_Microsoft"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-09-01",
+ "name": "[format('{0}/{1}', parameters('profileName'), parameters('endpointName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ],
+ "deliveryPolicy": {
+ "description": "Add Response Headers",
+ "rules": [
+ {
+ "name": "GeoMatchCondition",
+ "order": 1,
+ "conditions": [
+ {
+ "name": "RemoteAddress",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleRemoteAddressConditionParameters",
+ "operator": "GeoMatch",
+ "matchValues": [
+ "US"
+ ]
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "ModifyResponseHeader",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleHeaderActionParameters",
+ "headerAction": "Overwrite",
+ "headerName": "X-CLIENT-COUNTRY",
+ "value": "US"
+ }
+ }
+ ]
+ },
+ {
+ "name": "IPv4Match",
+ "order": 2,
+ "conditions": [
+ {
+ "name": "RemoteAddress",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleRemoteAddressConditionParameters",
+ "operator": "IPMatch",
+ "matchValues": [
+ "0.0.0.0/0"
+ ]
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "ModifyResponseHeader",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleHeaderActionParameters",
+ "headerAction": "Overwrite",
+ "headerName": "X-CLIENT-IP-VERSION",
+ "value": "IPv4"
+ }
+ }
+ ]
+ },
+ {
+ "name": "IPv6Match",
+ "order": 3,
+ "conditions": [
+ {
+ "name": "RemoteAddress",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleRemoteAddressConditionParameters",
+ "operator": "IPMatch",
+ "matchValues": [
+ "::0/0"
+ ]
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "ModifyResponseHeader",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleHeaderActionParameters",
+ "headerAction": "Overwrite",
+ "headerName": "X-CLIENT-IP-VERSION",
+ "value": "IPv6"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT981 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT981
new file mode 100644
index 0000000..ec2749f
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT981
@@ -0,0 +1,186 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-rewriteandredirect/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-rewriteandredirect/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903281,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-rewriteandredirect/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-rewriteandredirect/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT981",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT981",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "11918759781994806247"
+ }
+ },
+ "parameters": {
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "CDNSku": {
+ "type": "string",
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Akamai",
+ "Standard_Verizon",
+ "Premium_Verizon",
+ "Standard_Microsoft"
+ ],
+ "metadata": {
+ "description": "CDN SKU names"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_Microsoft"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-09-01",
+ "name": "[format('{0}/{1}', parameters('profileName'), parameters('endpointName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ],
+ "deliveryPolicy": {
+ "description": "Rewrite and Redirect",
+ "rules": [
+ {
+ "name": "PathRewriteBasedOnDeviceMatchCondition",
+ "order": 1,
+ "conditions": [
+ {
+ "name": "IsDevice",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleIsDeviceConditionParameters",
+ "operator": "Equal",
+ "matchValues": [
+ "Mobile"
+ ]
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "UrlRewrite",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleUrlRewriteActionParameters",
+ "sourcePattern": "/standard",
+ "destination": "/mobile"
+ }
+ }
+ ]
+ },
+ {
+ "name": "HttpVersionBasedRedirect",
+ "order": 2,
+ "conditions": [
+ {
+ "name": "RequestScheme",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleRequestSchemeConditionParameters",
+ "operator": "Equal",
+ "matchValues": [
+ "HTTP"
+ ]
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "UrlRedirect",
+ "parameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleUrlRedirectActionParameters",
+ "redirectType": "Found",
+ "destinationProtocol": "Https"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT982 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT982
new file mode 100644
index 0000000..74ec427
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT982
@@ -0,0 +1,289 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-urlsigning/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-urlsigning/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903289,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-urlsigning/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-ruleseengine-urlsigning/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT982",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT982",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "5800695290300643626"
+ }
+ },
+ "parameters": {
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "urlSigningKeysSubId": {
+ "type": "string",
+ "metadata": {
+ "description": "Subscription Id of UrlSigning Keys"
+ },
+ "value": "GEN-KEYVAULT-SUBSCRIPTION-ID"
+ },
+ "urlSigningKeysResourceGroup": {
+ "type": "string",
+ "metadata": {
+ "description": "Resourcegroup of UrlSigning Keys"
+ },
+ "value": "KEYVAULT-RESOURCEGROUP-NAME"
+ },
+ "urlSigningKeysVaultName": {
+ "type": "string",
+ "metadata": {
+ "description": "Keyvault of UrlSigning Keys"
+ },
+ "value": "GEN-KEYVAULT-NAME"
+ },
+ "urlSigningKeysSecret1Name": {
+ "type": "string",
+ "metadata": {
+ "description": "UrlSigning keys secret1 Name"
+ },
+ "value": "GEN-KEYVAULT-URLSIGN-SECRET1-NAME"
+ },
+ "urlSigningKeysSecret1Version": {
+ "type": "string",
+ "metadata": {
+ "description": "UrlSigning keys secret1 version"
+ },
+ "value": "GEN-KEYVAULT-URLSIGN-SECRET1-VERSION"
+ },
+ "urlSigningKeysSecret2Name": {
+ "type": "string",
+ "metadata": {
+ "description": "UrlSigning keys secret2 Name"
+ },
+ "value": "GEN-KEYVAULT-URLSIGN-SECRET2-NAME"
+ },
+ "urlSigningKeysSecret2Version": {
+ "type": "string",
+ "metadata": {
+ "description": "UrlSigning keys secret2 version"
+ },
+ "value": "GEN-KEYVAULT-URLSIGN-SECRET2-VERSION"
+ },
+ "CDNSku": {
+ "type": "string",
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Akamai",
+ "Standard_Verizon",
+ "Premium_Verizon",
+ "Standard_Microsoft"
+ ],
+ "metadata": {
+ "description": "CDN SKU names"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_Microsoft"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-09-01",
+ "name": "[format('{0}/{1}', parameters('profileName'), parameters('endpointName'))]",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "UseQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ],
+ "urlSigningKeys": [
+ {
+ "keyId": "key1",
+ "keySourceParameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.KeyVaultSigningKeyParameters",
+ "subscriptionId": "GEN-KEYVAULT-SUBSCRIPTION-ID",
+ "resourceGroupName": "KEYVAULT-RESOURCEGROUP-NAME",
+ "vaultName": "GEN-KEYVAULT-NAME",
+ "secretName": "GEN-KEYVAULT-URLSIGN-SECRET1-NAME",
+ "secretVersion": "GEN-KEYVAULT-URLSIGN-SECRET1-VERSION"
+ }
+ },
+ {
+ "keyId": "key2",
+ "keySourceParameters": {
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.KeyVaultSigningKeyParameters",
+ "subscriptionId": "GEN-KEYVAULT-SUBSCRIPTION-ID",
+ "resourceGroupName": "KEYVAULT-RESOURCEGROUP-NAME",
+ "vaultName": "GEN-KEYVAULT-NAME",
+ "secretName": "GEN-KEYVAULT-URLSIGN-SECRET2-NAME",
+ "secretVersion": "GEN-KEYVAULT-URLSIGN-SECRET2-VERSION"
+ }
+ }
+ ],
+ "deliveryPolicy": {
+ "description": "UrlSigning",
+ "rules": [
+ {
+ "name": "rule1",
+ "order": 1,
+ "conditions": [
+ {
+ "name": "UrlPath",
+ "parameters": {
+ "operator": "Equal",
+ "matchValues": [
+ "/urlsigning/test"
+ ],
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleUrlPathMatchConditionParameters"
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "UrlSigning",
+ "parameters": {
+ "keyId": "key1",
+ "algorithm": "SHA256",
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleUrlSigningActionParameters"
+ }
+ },
+ {
+ "name": "CacheKeyQueryString",
+ "parameters": {
+ "queryStringBehavior": "Exclude",
+ "queryParameters": "expires,keyid,signature",
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleCacheKeyQueryStringBehaviorActionParameters"
+ }
+ }
+ ]
+ },
+ {
+ "name": "rule2",
+ "order": 2,
+ "conditions": [
+ {
+ "name": "UrlPath",
+ "parameters": {
+ "operator": "Equal",
+ "matchValues": [
+ "/urlsigning/test2"
+ ],
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleUrlPathMatchConditionParameters"
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "UrlSigning",
+ "parameters": {
+ "keyId": "key2",
+ "algorithm": "SHA256",
+ "parameterNameOverride": [
+ {
+ "paramIndicator": "Expires",
+ "paramName": "oexpires"
+ },
+ {
+ "paramIndicator": "KeyId",
+ "paramName": "okeyid"
+ },
+ {
+ "paramIndicator": "Signature",
+ "paramName": "osignature"
+ }
+ ],
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleUrlSigningActionParameters"
+ }
+ },
+ {
+ "name": "CacheKeyQueryString",
+ "parameters": {
+ "queryStringBehavior": "Exclude",
+ "queryParameters": "oexpires,okeyid,osignature",
+ "@odata.type": "#Microsoft.Azure.Cdn.Models.DeliveryRuleCacheKeyQueryStringBehaviorActionParameters"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE"
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT983 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT983
new file mode 100644
index 0000000..82c1212
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT983
@@ -0,0 +1,131 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-storage-account/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-storage-account/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903297,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-storage-account/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-storage-account/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT983",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.storage/storageaccounts",
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT983",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1.14562",
+ "templateHash": "17059297737130475169"
+ }
+ },
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "storageAccountName": "[format('storage{0}', uniqueString(resourceGroup().id))]",
+ "endpointName": "[format('endpoint-{0}', uniqueString(resourceGroup().id))]",
+ "profileName": "[format('cdn-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2021-01-01",
+ "name": "[format('storage{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[format('storage{0}', uniqueString(resourceGroup().id))]"
+ },
+ "kind": "StorageV2",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-09-01",
+ "name": "[format('cdn-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[format('cdn-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "sku": {
+ "name": "Standard_Verizon"
+ }
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-09-01",
+ "name": "[format('{0}/{1}', variables('profileName'), variables('endpointName'))]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[format('endpoint-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "properties": {
+ "originHostHeader": "[replace(replace(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob, 'https://', ''), '/', '')]",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "[replace(replace(reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob, 'https://', ''), '/', '')]"
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/[format('cdn-{0}', uniqueString(resourceGroup().id))]",
+ "Microsoft.Storage/storageAccounts/[format('storage{0}', uniqueString(resourceGroup().id))]"
+ ]
+ }
+ ],
+ "outputs": {
+ "hostName": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Cdn/profiles/endpoints', variables('profileName'), variables('endpointName'))).hostName]"
+ },
+ "originHostHeader": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Cdn/profiles/endpoints', variables('profileName'), variables('endpointName'))).originHostHeader]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT984 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT984
new file mode 100644
index 0000000..5ead2e1
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT984
@@ -0,0 +1,252 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-waf-custom-rules/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-waf-custom-rules/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903304,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-waf-custom-rules/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-waf-custom-rules/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT984",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/cdnwebapplicationfirewallpolicies",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT984",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "policyName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN WAF Policy"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "policyMode": {
+ "type": "string",
+ "metadata": {
+ "description": "The enforcement mode of the CDN WAF Policy"
+ },
+ "defaultValue": "Detection",
+ "allowedValues": [
+ "Detection",
+ "Prevention"
+ ]
+ },
+ "enabledState": {
+ "type": "string",
+ "metadata": {
+ "description": "Whether the CDN WAF Policy is enabled"
+ },
+ "defaultValue": "Enabled",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ]
+ },
+ "redirectUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "The redirect URL of the CDN WAF Policy"
+ },
+ "defaultValue": "https://contoso.com/login"
+ },
+ "CDNSku": {
+ "type": "string",
+ "metadata": {
+ "description": "CDN SKU names"
+ },
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Microsoft"
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location the CDN profile and endpoint."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/CdnWebApplicationFirewallPolicies",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "Global",
+ "sku": {
+ "name": "Standard_Microsoft"
+ },
+ "properties": {
+ "policySettings": {
+ "enabledState": "Enabled",
+ "mode": "Detection",
+ "defaultRedirectUrl": "https://contoso.com/login"
+ },
+ "customRules": {
+ "rules": [
+ {
+ "name": "BlockOutsideNorthAmerica",
+ "priority": 10,
+ "enabledState": "Enabled",
+ "matchConditions": [
+ {
+ "matchVariable": "RemoteAddr",
+ "operator": "GeoMatch",
+ "negateCondition": true,
+ "matchValue": [
+ "US",
+ "MX",
+ "CA"
+ ]
+ }
+ ],
+ "action": "Block"
+ },
+ {
+ "name": "RedirectIPMatch",
+ "priority": 20,
+ "enabledState": "Enabled",
+ "matchConditions": [
+ {
+ "matchVariable": "RemoteAddr",
+ "operator": "IPMatch",
+ "negateCondition": false,
+ "matchValue": [
+ "1.0.0.0/8",
+ "2.1.1.1",
+ "ffff::/16"
+ ]
+ }
+ ],
+ "action": "Redirect"
+ },
+ {
+ "name": "AllowUnauthenticatedLogin",
+ "priority": 30,
+ "enabledState": "Enabled",
+ "matchConditions": [
+ {
+ "matchVariable": "RequestUri",
+ "operator": "Contains",
+ "negateCondition": false,
+ "matchValue": [
+ "/login"
+ ]
+ }
+ ],
+ "action": "Allow"
+ },
+ {
+ "name": "RedirectUnauthenticated",
+ "priority": 40,
+ "enabledState": "Enabled",
+ "matchConditions": [
+ {
+ "matchVariable": "Cookies",
+ "selector": "SESSIONID",
+ "transforms": [
+ "Trim"
+ ],
+ "operator": "LessThanOrEqual",
+ "negateCondition": false,
+ "matchValue": [
+ "0"
+ ]
+ }
+ ],
+ "action": "Redirect"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE",
+ "type": "Microsoft.Cdn/profiles",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2019-06-15-preview",
+ "sku": {
+ "name": "Standard_Microsoft"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-06-15-preview",
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE",
+ "Microsoft.Cdn/CdnWebApplicationFirewallPolicies/GEN-UNIQUE"
+ ],
+ "location": "[resourceGroup().location]",
+ "name": "GEN-UNIQUE",
+ "type": "endpoints",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ],
+ "webApplicationFirewallPolicyLink": {
+ "id": "Microsoft.Cdn/CdnWebApplicationFirewallPolicies/GEN-UNIQUE"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT985 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT985
new file mode 100644
index 0000000..dce63d5
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT985
@@ -0,0 +1,165 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-waf-managed-rules/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-waf-managed-rules/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903312,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-waf-managed-rules/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-waf-managed-rules/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT985",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/cdnwebapplicationfirewallpolicies",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT985",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "policyName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN WAF Policy"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "policyMode": {
+ "type": "string",
+ "metadata": {
+ "description": "The enforcement mode of the CDN WAF Policy"
+ },
+ "defaultValue": "Detection",
+ "allowedValues": [
+ "Detection",
+ "Prevention"
+ ]
+ },
+ "CDNSku": {
+ "type": "string",
+ "metadata": {
+ "description": "CDN SKU names"
+ },
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Microsoft"
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location the CDN profile and endpoint."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/CdnWebApplicationFirewallPolicies",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "Global",
+ "sku": {
+ "name": "Standard_Microsoft"
+ },
+ "properties": {
+ "policySettings": {
+ "enabledState": "Enabled",
+ "mode": "Detection"
+ },
+ "managedRules": {
+ "managedRuleSets": [
+ {
+ "ruleSetType": "DefaultRuleSet",
+ "ruleSetVersion": "1.0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE",
+ "type": "Microsoft.Cdn/profiles",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2019-06-15-preview",
+ "sku": {
+ "name": "Standard_Microsoft"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-06-15-preview",
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE",
+ "Microsoft.Cdn/CdnWebApplicationFirewallPolicies/GEN-UNIQUE"
+ ],
+ "location": "[resourceGroup().location]",
+ "name": "GEN-UNIQUE",
+ "type": "endpoints",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ],
+ "webApplicationFirewallPolicyLink": {
+ "id": "Microsoft.Cdn/CdnWebApplicationFirewallPolicies/GEN-UNIQUE"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT986 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT986
new file mode 100644
index 0000000..1591cc3
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT986
@@ -0,0 +1,215 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-waf-rate-limit-rules/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-waf-rate-limit-rules/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903319,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-waf-rate-limit-rules/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-waf-rate-limit-rules/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT986",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cdn/cdnwebapplicationfirewallpolicies",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT986",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "policyName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN WAF Policy"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "profileName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "endpointName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the CDN Endpoint"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "originUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "Url of the origin"
+ },
+ "value": "www.microsoft.com"
+ },
+ "policyMode": {
+ "type": "string",
+ "metadata": {
+ "description": "The enforcement mode of the CDN WAF Policy"
+ },
+ "defaultValue": "Detection",
+ "allowedValues": [
+ "Detection",
+ "Prevention"
+ ]
+ },
+ "enabledState": {
+ "type": "string",
+ "metadata": {
+ "description": "Whether the CDN WAF Policy is enabled"
+ },
+ "defaultValue": "Enabled",
+ "allowedValues": [
+ "Enabled",
+ "Disabled"
+ ]
+ },
+ "redirectUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "The redirect URL of the CDN WAF Policy"
+ },
+ "defaultValue": "https://contoso.com/login"
+ },
+ "CDNSku": {
+ "type": "string",
+ "metadata": {
+ "description": "CDN SKU names"
+ },
+ "defaultValue": "Standard_Microsoft",
+ "allowedValues": [
+ "Standard_Microsoft"
+ ]
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location the CDN profile and endpoint."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Cdn/CdnWebApplicationFirewallPolicies",
+ "apiVersion": "2020-09-01",
+ "name": "GEN-UNIQUE",
+ "location": "Global",
+ "sku": {
+ "name": "Standard_Microsoft"
+ },
+ "properties": {
+ "policySettings": {
+ "enabledState": "Enabled",
+ "mode": "Detection",
+ "defaultRedirectUrl": "https://contoso.com/login"
+ },
+ "rateLimitRules": {
+ "rules": [
+ {
+ "name": "BaseLimit",
+ "priority": 100,
+ "enabledState": "Enabled",
+ "rateLimitThreshold": 1000,
+ "rateLimitDurationInMinutes": 1,
+ "matchConditions": [
+ {
+ "matchVariable": "RequestMethod",
+ "operator": "Any",
+ "negateCondition": false
+ }
+ ],
+ "action": "Block"
+ },
+ {
+ "name": "WriteLimit",
+ "priority": 50,
+ "enabledState": "Enabled",
+ "rateLimitThreshold": 100,
+ "rateLimitDurationInMinutes": 1,
+ "matchConditions": [
+ {
+ "matchVariable": "RequestMethod",
+ "operator": "Equal",
+ "negateCondition": false,
+ "matchValue": [
+ "POST",
+ "PUT",
+ "PATCH"
+ ]
+ }
+ ],
+ "action": "Redirect"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "name": "GEN-UNIQUE",
+ "type": "Microsoft.Cdn/profiles",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2019-06-15-preview",
+ "sku": {
+ "name": "Standard_Microsoft"
+ },
+ "resources": [
+ {
+ "apiVersion": "2019-06-15-preview",
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/GEN-UNIQUE",
+ "Microsoft.Cdn/CdnWebApplicationFirewallPolicies/GEN-UNIQUE"
+ ],
+ "location": "[resourceGroup().location]",
+ "name": "GEN-UNIQUE",
+ "type": "endpoints",
+ "properties": {
+ "originHostHeader": "www.microsoft.com",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "www.microsoft.com"
+ }
+ }
+ ],
+ "webApplicationFirewallPolicyLink": {
+ "id": "Microsoft.Cdn/CdnWebApplicationFirewallPolicies/GEN-UNIQUE"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT987 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT987
new file mode 100644
index 0000000..aeb2689
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT987
@@ -0,0 +1,180 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-web-app/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-web-app/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903326,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cdn/cdn-with-web-app/azuredeploy.json",
+ "/quickstarts/microsoft.cdn/cdn-with-web-app/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT987",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.web/sites",
+ "microsoft.web/serverfarms",
+ "microsoft.cdn/profiles/endpoints",
+ "microsoft.cdn/profiles"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT987",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1008.15138",
+ "templateHash": "16325559001506718153"
+ }
+ },
+ "parameters": {
+ "profileName": {
+ "type": "string",
+ "defaultValue": "[format('cdn-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the CDN Profile"
+ }
+ },
+ "endpointName": {
+ "type": "string",
+ "defaultValue": "[format('endpoint-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the CDN Endpoint, must be unique"
+ }
+ },
+ "serverFarmName": {
+ "type": "string",
+ "defaultValue": "[format('asp-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the App Service Plan"
+ }
+ },
+ "webAppName": {
+ "type": "string",
+ "defaultValue": "[format('web-{0}', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of the App Service Web App"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "resources": [
+ {
+ "type": "Microsoft.Web/serverfarms",
+ "apiVersion": "2021-02-01",
+ "name": "[format('asp-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[format('asp-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "sku": {
+ "name": "F1",
+ "capacity": 1
+ }
+ },
+ {
+ "type": "Microsoft.Web/sites",
+ "apiVersion": "2021-02-01",
+ "name": "[format('web-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[format('web-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "properties": {
+ "serverFarmId": "Microsoft.Web/serverfarms/[format('asp-{0}', uniqueString(resourceGroup().id))]",
+ "siteConfig": {
+ "ftpsState": "FtpsOnly",
+ "minTlsVersion": "1.2",
+ "scmMinTlsVersion": "1.2"
+ },
+ "httpsOnly": true
+ },
+ "identity": {
+ "type": "SystemAssigned"
+ },
+ "dependsOn": [
+ "Microsoft.Web/serverfarms/[format('asp-{0}', uniqueString(resourceGroup().id))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Cdn/profiles",
+ "apiVersion": "2020-09-01",
+ "name": "[format('cdn-{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[format('cdn-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "sku": {
+ "name": "Standard_Microsoft"
+ },
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Cdn/profiles/endpoints",
+ "apiVersion": "2020-09-01",
+ "name": "[format('{0}/{1}', parameters('profileName'), parameters('endpointName'))]",
+ "location": "[resourceGroup().location]",
+ "tags": {
+ "displayName": "[format('endpoint-{0}', uniqueString(resourceGroup().id))]"
+ },
+ "properties": {
+ "originHostHeader": "[reference(resourceId('Microsoft.Web/sites', parameters('webAppName'))).hostNames[0]]",
+ "isHttpAllowed": true,
+ "isHttpsAllowed": true,
+ "queryStringCachingBehavior": "IgnoreQueryString",
+ "contentTypesToCompress": [
+ "text/plain",
+ "text/html",
+ "text/css",
+ "application/x-javascript",
+ "text/javascript"
+ ],
+ "isCompressionEnabled": true,
+ "origins": [
+ {
+ "name": "origin1",
+ "properties": {
+ "hostName": "[reference(resourceId('Microsoft.Web/sites', parameters('webAppName'))).hostNames[0]]"
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Cdn/profiles/[format('cdn-{0}', uniqueString(resourceGroup().id))]",
+ "Microsoft.Web/sites/[format('web-{0}', uniqueString(resourceGroup().id))]"
+ ]
+ }
+ ],
+ "outputs": {
+ "hostName": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Cdn/profiles/endpoints', parameters('profileName'), parameters('endpointName'))).hostName]"
+ },
+ "originHostHeader": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Cdn/profiles/endpoints', parameters('profileName'), parameters('endpointName'))).originHostHeader]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT988 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT988
new file mode 100644
index 0000000..ca76930
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT988
@@ -0,0 +1,77 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-Computer-vision-API/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-Computer-vision-API/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903334,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-Computer-vision-API/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-Computer-vision-API/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT988",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cognitiveservices/accounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT988",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "accountName": {
+ "defaultValue": "computervision",
+ "metadata": {
+ "description": "Display name of Computer Vision API account"
+ },
+ "type": "string",
+ "value": "GEN-UNIQUE"
+ },
+ "SKU": {
+ "type": "string",
+ "metadata": {
+ "description": "SKU for Computer Vision API"
+ },
+ "defaultValue": "F0",
+ "allowedValues": [
+ "F0",
+ "S1"
+ ],
+ "value": "S1"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.CognitiveServices/accounts",
+ "apiVersion": "2017-04-18",
+ "name": "GEN-UNIQUE",
+ "location": "Location",
+ "kind": "ComputerVision",
+ "sku": {
+ "name": "S1"
+ },
+ "properties": {}
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT989 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT989
new file mode 100644
index 0000000..93a29a8
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT989
@@ -0,0 +1,78 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903339,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT989",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cognitiveservices/accounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT989",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "accountName": {
+ "defaultValue": "TextTranslation",
+ "metadata": {
+ "description": "Display name of Text Translation API account"
+ },
+ "type": "string"
+ },
+ "SKU": {
+ "type": "string",
+ "defaultValue": "S1",
+ "metadata": {
+ "description": "SKU for Text Translation API"
+ },
+ "allowedValues": [
+ "F0",
+ "S1",
+ "S2",
+ "S3",
+ "S4"
+ ]
+ },
+ "translateLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for the account"
+ },
+ "value": "global"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.CognitiveServices/accounts",
+ "apiVersion": "2017-04-18",
+ "name": "TextTranslation",
+ "location": "translatelocation",
+ "kind": "TextTranslation",
+ "sku": {
+ "name": "S1"
+ },
+ "properties": {}
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT99 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT99
new file mode 100644
index 0000000..1dad1d6
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT99
@@ -0,0 +1,479 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/application-workloads/cloudlens/cloudlens-suricata-ubuntu/azuredeploy.json",
+ "/application-workloads/cloudlens/cloudlens-suricata-ubuntu/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962886416,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/application-workloads/cloudlens/cloudlens-suricata-ubuntu/azuredeploy.json",
+ "/application-workloads/cloudlens/cloudlens-suricata-ubuntu/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT99",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines/extensions",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT99",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "cloudlensProjectKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The CloudLens Project Key. Used by the agents to connect back to the backend."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "User name for the Virtual Machine."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "toolVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "The vm size where Suricata will be deployed"
+ }
+ },
+ "toolVmName": {
+ "type": "string",
+ "defaultValue": "SuricataIDS",
+ "metadata": {
+ "description": "The name of the vm where Suricata will be deployed"
+ }
+ },
+ "tapVmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "The vm size where the tap will be deployed"
+ }
+ },
+ "tapVmName": {
+ "type": "string",
+ "defaultValue": "CloudLensTap",
+ "metadata": {
+ "description": "The name of the vm where the tap will be deployed"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "The base URI where artifacts required by this template are located. When the template is deployed using the accompanying scripts, a private location in the subscription will be used and this value will be automatically generated."
+ },
+ "defaultValue": "[deployment().properties.templatelink.uri]"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "securestring",
+ "metadata": {
+ "description": "The sasToken required to access _artifactsLocation. When the template is deployed using the accompanying scripts, a sasToken will be automatically generated."
+ },
+ "defaultValue": ""
+ },
+ "authenticationType": {
+ "type": "string",
+ "defaultValue": "sshPublicKey",
+ "allowedValues": [
+ "sshPublicKey",
+ "password"
+ ],
+ "metadata": {
+ "description": "Type of authentication to use on the Virtual Machine. SSH key is recommended."
+ }
+ },
+ "adminPasswordOrKey": {
+ "type": "securestring",
+ "metadata": {
+ "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
+ },
+ "value": "GEN-SSH-PUB-KEY"
+ }
+ },
+ "variables": {
+ "imagePublisher": "Canonical",
+ "imageOffer": "UbuntuServer",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet",
+ "subnetPrefix": "10.0.0.0/24",
+ "storageAccountType": "Standard_LRS",
+ "publicIPAddressType": "Dynamic",
+ "virtualNetworkName": "CloudLensVNET",
+ "ubuntuOSVersion": "16.04.0-LTS",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/CloudLensVNET/Subnet",
+ "toolPublicIPAddressName": "suricataPublicIP",
+ "toolStorageAccountName": "[concat('tooldisk', uniquestring(resourceGroup().id))]",
+ "toolDnsLabelPrefix": "[concat('suricata-',uniquestring(resourceGroup().id))]",
+ "toolNicName": "SuricataVMNic",
+ "tapPublicIPAddressName": "cloudlensPublicIP",
+ "tapStorageAccountName": "[concat('tapdisk', uniquestring(resourceGroup().id))]",
+ "tapDnsLabelPrefix": "[concat('cloudlens-',uniquestring(resourceGroup().id))]",
+ "tapNicName": "CloudLensVMNic",
+ "linuxConfiguration": {
+ "disablePasswordAuthentication": true,
+ "ssh": {
+ "publicKeys": [
+ {
+ "path": "/home/GEN-UNIQUE/.ssh/authorized_keys",
+ "keyData": "GEN-SSH-PUB-KEY"
+ }
+ ]
+ }
+ },
+ "networkSecurityGroupName": "default-NSG"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('toolStorageAccountName')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[variables('tapStorageAccountName')]",
+ "apiVersion": "2021-02-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "Storage",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "suricataPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[variables('toolDnsLabelPrefix')]"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "cloudlensPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "[variables('tapDnsLabelPrefix')]"
+ }
+ }
+ },
+ {
+ "comments": "Default Network Security Group for template",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-07-01",
+ "name": "default-NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-22",
+ "properties": {
+ "priority": 1000,
+ "access": "Allow",
+ "direction": "Inbound",
+ "destinationPortRange": "22",
+ "protocol": "Tcp",
+ "sourceAddressPrefix": "*",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "CloudLensVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/default-NSG"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/default-NSG"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "SuricataVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//suricataPublicIP",
+ "Microsoft.Network/virtualNetworks//CloudLensVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/suricataPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/CloudLensVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-07-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "CloudLensVMNic",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//cloudlensPublicIP",
+ "Microsoft.Network/virtualNetworks//CloudLensVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/cloudlensPublicIP"
+ },
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/CloudLensVNET/Subnet"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "SuricataIDS",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('toolStorageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('toolNicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "SuricataIDS",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04.0-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": 1023,
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/SuricataVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('toolStorageAccountName'), '2021-04-01').primaryEndpoints['blob']]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "CloudLensTap",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "[resourceId('Microsoft.Storage/storageAccounts/', variables('tapStorageAccountName'))]",
+ "[resourceId('Microsoft.Network/networkInterfaces/', variables('tapNicName'))]"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "CloudLensTap",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-SSH-PUB-KEY",
+ "linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04.0-LTS",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ },
+ "dataDisks": [
+ {
+ "diskSizeGB": 1023,
+ "lun": 0,
+ "createOption": "Empty"
+ }
+ ]
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/CloudLensVMNic"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('tapStorageAccountName')), '2021-04-01').primaryEndpoints.blob]"
+ }
+ }
+ }
+ },
+ {
+ "name": "SuricataIDS/config",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//SuricataIDS"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "skipDos2Unix": false,
+ "timestamp": 123456789
+ },
+ "protectedSettings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/setup-suricata.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "./setup-suricata.sh GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "name": "CloudLensTap/config",
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "location": "[resourceGroup().location]",
+ "apiVersion": "2020-12-01",
+ "dependsOn": [
+ "Microsoft.Compute/virtualMachines//CloudLensTap"
+ ],
+ "properties": {
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "typeHandlerVersion": "2.0",
+ "autoUpgradeMinorVersion": true,
+ "settings": {
+ "skipDos2Unix": false,
+ "timestamp": 123456789
+ },
+ "protectedSettings": {
+ "fileUris": [
+ "[uri(parameters('_artifactsLocation'), concat('scripts/setup-tap.sh', parameters('_artifactsLocationSasToken')))]"
+ ],
+ "commandToExecute": "./setup-tap.sh GEN-UNIQUE"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "Suricata SSH Command": {
+ "type": "string",
+ "value": "[concat('ssh ', parameters('adminUsername'), '@', reference(variables('toolPublicIPAddressName')).dnsSettings.fqdn)]"
+ },
+ "Suricata Host Name": {
+ "type": "string",
+ "value": "[reference(variables('toolPublicIPAddressName')).dnsSettings.fqdn]"
+ },
+ "Tapping Host SSH Command": {
+ "type": "string",
+ "value": "[concat('ssh ', parameters('adminUsername'), '@', reference(variables('tapPublicIPAddressName')).dnsSettings.fqdn)]"
+ },
+ "Tapping Host Name": {
+ "type": "string",
+ "value": "[reference(variables('tapPublicIPAddressName')).dnsSettings.fqdn]"
+ }
+ },
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT990 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT990
new file mode 100644
index 0000000..510f549
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT990
@@ -0,0 +1,78 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.parameters.us.json"
+ ],
+ "timestamp": 1642962903345,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-translate/azuredeploy.parameters.us.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT990",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cognitiveservices/accounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT990",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "accountName": {
+ "defaultValue": "TextTranslation",
+ "metadata": {
+ "description": "Display name of Text Translation API account"
+ },
+ "type": "string"
+ },
+ "SKU": {
+ "type": "string",
+ "defaultValue": "S1",
+ "metadata": {
+ "description": "SKU for Text Translation API"
+ },
+ "allowedValues": [
+ "F0",
+ "S1",
+ "S2",
+ "S3",
+ "S4"
+ ]
+ },
+ "translateLocation": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for the account"
+ },
+ "value": "usgovvirginia"
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.CognitiveServices/accounts",
+ "apiVersion": "2017-04-18",
+ "name": "TextTranslation",
+ "location": "translatelocation",
+ "kind": "TextTranslation",
+ "sku": {
+ "name": "S1"
+ },
+ "properties": {}
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT991 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT991
new file mode 100644
index 0000000..236f962
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT991
@@ -0,0 +1,74 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-universalkey/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-universalkey/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903351,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-universalkey/azuredeploy.json",
+ "/quickstarts/microsoft.cognitiveservices/cognitive-services-universalkey/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT991",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.cognitiveservices/accounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT991",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "cognitiveServiceName": {
+ "type": "string",
+ "defaultValue": "[concat('CognitiveService-', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "That name is the name of our application. It has to be unique.Type a name followed by your resource group name. (-)"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "sku": {
+ "type": "string",
+ "defaultValue": "S0",
+ "allowedValues": [
+ "S0"
+ ]
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.CognitiveServices/accounts",
+ "apiVersion": "2017-04-18",
+ "name": "GEN-UNIQUE",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "S0"
+ },
+ "kind": "CognitiveServices",
+ "properties": {
+ "statisticsEnabled": false
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT992 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT992
new file mode 100644
index 0000000..de2e437
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT992
@@ -0,0 +1,312 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/1-vm-loadbalancer-2-nics/azuredeploy.json",
+ "/quickstarts/microsoft.compute/1-vm-loadbalancer-2-nics/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903358,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/1-vm-loadbalancer-2-nics/azuredeploy.json",
+ "/quickstarts/microsoft.compute/1-vm-loadbalancer-2-nics/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT992",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT992",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password."
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "dnsNameforLBIP": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS for Load Balancer IP."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "location": {
+ "type": "string",
+ "metadata": {
+ "description": "Location for all resources."
+ },
+ "defaultValue": "[resourceGroup().location]"
+ },
+ "storageAccountName": {
+ "type": "string",
+ "defaultValue": "[concat('storage', uniqueString(resourceGroup().id))]",
+ "metadata": {
+ "description": "Name of storage account."
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2_v3",
+ "metadata": {
+ "description": "Size of the virtual machine."
+ },
+ "value": "Standard_D2_v3"
+ }
+ },
+ "variables": {
+ "addressPrefix": "10.0.0.0/16",
+ "imageOffer": "WindowsServer",
+ "imagePublisher": "MicrosoftWindowsServer",
+ "imageSKU": "2019-Datacenter",
+ "lbName": "myLB",
+ "networkSecurityGroupName": "Subnet-1-nsg",
+ "nic1NamePrefix": "nic1",
+ "nic2NamePrefix": "nic2",
+ "publicIPAddressName": "myPublicIP",
+ "publicIPAddressType": "Dynamic",
+ "storageAccountType": "Standard_LRS",
+ "subnetName": "Subnet-1",
+ "subnetPrefix": "10.0.0.0/24",
+ "vmNamePrefix": "myVM",
+ "vnetName": "myVNET"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2019-06-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "name": "myLB",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "BackendPool1"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "RDP-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50001,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ }
+ ]
+ }
+ },
+ {
+ "comments": "Simple Network Security Group for subnet [variables('subnetName')]",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-05-01",
+ "name": "Subnet-1-nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nic1",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//myVNET",
+ "Microsoft.Network/loadBalancers//myLB"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVNET/Subnet-1"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/myLB/BackendPool1"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/myLB/RDP-VM0"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "nic2",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//myVNET"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVNET/Subnet-1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "myVM",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE",
+ "Microsoft.Network/networkInterfaces//nic1",
+ "Microsoft.Network/networkInterfaces//nic2"
+ ],
+ "properties": {
+ "hardwareProfile": {
+ "vmSize": "Standard_D2_v3"
+ },
+ "osProfile": {
+ "computerName": "myVM",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "properties": {
+ "primary": true
+ },
+ "id": "Microsoft.Network/networkInterfaces/nic1"
+ },
+ {
+ "properties": {
+ "primary": false
+ },
+ "id": "Microsoft.Network/networkInterfaces/nic2"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(parameters('storageAccountName'), '2019-06-01').primaryEndpoints.blob]"
+ }
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "myVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/Subnet-1-nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/Subnet-1-nsg"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT993 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT993
new file mode 100644
index 0000000..3d34785
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT993
@@ -0,0 +1,293 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/1vm-2nics-2subnets-1vnet/azuredeploy.json",
+ "/quickstarts/microsoft.compute/1vm-2nics-2subnets-1vnet/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903366,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/1vm-2nics-2subnets-1vnet/azuredeploy.json",
+ "/quickstarts/microsoft.compute/1vm-2nics-2subnets-1vnet/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT993",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.storage/storageaccounts"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT993",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "metadata": {
+ "_generator": {
+ "name": "bicep",
+ "version": "0.4.1.14562",
+ "templateHash": "4848305918507774483"
+ }
+ },
+ "parameters": {
+ "virtualMachineSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Virtual machine size (has to be at least the size of Standard_A3 to support 2 NICs)"
+ }
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Default Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "secureString",
+ "metadata": {
+ "description": "Default Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "storageAccountType": {
+ "type": "string",
+ "defaultValue": "Standard_LRS",
+ "allowedValues": [
+ "Standard_LRS",
+ "Premium_LRS"
+ ],
+ "metadata": {
+ "description": "Storage Account type for the VM and VM diagnostic storage"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "functions": [],
+ "variables": {
+ "virtualMachineName": "VM-MultiNic",
+ "nic1Name": "nic-1",
+ "nic2Name": "nic-2",
+ "virtualNetworkName": "virtualNetwork",
+ "subnet1Name": "subnet-1",
+ "subnet2Name": "subnet-2",
+ "publicIPAddressName": "publicIp",
+ "diagStorageAccountName": "[format('diags{0}', uniqueString(resourceGroup().id))]",
+ "networkSecurityGroupName": "NSG",
+ "networkSecurityGroupName2": "[format('{0}-nsg', variables('subnet2Name'))]"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-06-01",
+ "name": "VM-MultiNic",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "osProfile": {
+ "computerName": "VM-MultiNic",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD",
+ "windowsConfiguration": {
+ "provisionVMAgent": true
+ }
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "properties": {
+ "primary": true
+ },
+ "id": "Microsoft.Network/networkInterfaces/nic-1"
+ },
+ {
+ "properties": {
+ "primary": false
+ },
+ "id": "Microsoft.Network/networkInterfaces/nic-2"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('diagStorageAccountName'))).primaryEndpoints.blob]"
+ }
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/[format('diags{0}', uniqueString(resourceGroup().id))]",
+ "Microsoft.Network/networkInterfaces/nic-1",
+ "Microsoft.Network/networkInterfaces/nic-2"
+ ]
+ },
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2019-06-01",
+ "name": "[format('diags{0}', uniqueString(resourceGroup().id))]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-06-01",
+ "name": "[format('{0}-nsg', variables('subnet2Name'))]",
+ "location": "[resourceGroup().location]"
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-06-01",
+ "name": "virtualNetwork",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ },
+ {
+ "name": "subnet-2",
+ "properties": {
+ "addressPrefix": "10.0.1.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/[format('{0}-nsg', variables('subnet2Name'))]"
+ }
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/[format('{0}-nsg', variables('subnet2Name'))]"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "nic-1",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/virtualNetwork/subnet-1"
+ },
+ "privateIPAllocationMethod": "Dynamic",
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/publicIp"
+ }
+ }
+ }
+ ],
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/NSG"
+ }
+ },
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/NSG",
+ "Microsoft.Network/publicIPAddresses/publicIp",
+ "Microsoft.Network/virtualNetworks/virtualNetwork"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "nic-2",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/virtualNetwork/subnet-2"
+ },
+ "privateIPAllocationMethod": "Dynamic"
+ }
+ }
+ ]
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/virtualNetwork"
+ ]
+ },
+ {
+ "type": "Microsoft.Network/publicIPAddresses",
+ "apiVersion": "2020-06-01",
+ "name": "publicIp",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic"
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2020-06-01",
+ "name": "NSG",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "securityRules": [
+ {
+ "name": "default-allow-rdp",
+ "properties": {
+ "priority": 1000,
+ "sourceAddressPrefix": "*",
+ "protocol": "Tcp",
+ "destinationPortRange": "3389",
+ "access": "Allow",
+ "direction": "Inbound",
+ "sourcePortRange": "*",
+ "destinationAddressPrefix": "*"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT994 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT994
new file mode 100644
index 0000000..83dfcbc
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT994
@@ -0,0 +1,280 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/2-vms-internal-load-balancer/azuredeploy.json",
+ "/quickstarts/microsoft.compute/2-vms-internal-load-balancer/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903377,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/2-vms-internal-load-balancer/azuredeploy.json",
+ "/quickstarts/microsoft.compute/2-vms-internal-load-balancer/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT994",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT994",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "BackendVM",
+ "metadata": {
+ "description": "Prefix to use for VM names"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size of the virtual machines"
+ }
+ }
+ },
+ "variables": {
+ "availabilitySetName": "AvSet",
+ "storageAccountType": "Standard_LRS",
+ "storageAccountName": "[uniqueString(resourceGroup().id)]",
+ "virtualNetworkName": "vNet",
+ "subnetName": "backendSubnet",
+ "loadBalancerName": "ilb",
+ "networkInterfaceName": "nic",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/vNet/backendSubnet",
+ "numberOfInstances": 2
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "apiVersion": "2019-06-01",
+ "name": "[uniqueString(resourceGroup().id)]",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "apiVersion": "2020-06-01",
+ "name": "AvSet",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Aligned"
+ },
+ "properties": {
+ "PlatformUpdateDomainCount": 2,
+ "PlatformFaultDomainCount": 2
+ }
+ },
+ {
+ "type": "Microsoft.Network/virtualNetworks",
+ "apiVersion": "2020-06-01",
+ "name": "vNet",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "backendSubnet",
+ "properties": {
+ "addressPrefix": "10.0.2.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/networkInterfaces",
+ "apiVersion": "2020-06-01",
+ "name": "niccopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "vNet",
+ "ilb"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vNet/backendSubnet"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/ilb/BackendPool1"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Network/loadBalancers",
+ "apiVersion": "2020-06-01",
+ "name": "ilb",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard"
+ },
+ "dependsOn": [
+ "vNet"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "properties": {
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/vNet/backendSubnet"
+ },
+ "privateIPAddress": "10.0.2.6",
+ "privateIPAllocationMethod": "Static"
+ },
+ "name": "LoadBalancerFrontend"
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "BackendPool1"
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIpConfigurations/ilb/LoadBalancerFrontend"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/ilb/BackendPool1"
+ },
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/ilb/lbprobe"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "idleTimeoutInMinutes": 15
+ },
+ "Name": "lbrule"
+ }
+ ],
+ "probes": [
+ {
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 15,
+ "numberOfProbes": 2
+ },
+ "name": "lbprobe"
+ }
+ ]
+ }
+ },
+ {
+ "type": "Microsoft.Compute/virtualMachines",
+ "apiVersion": "2020-06-01",
+ "name": "BackendVMcopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "[uniqueString(resourceGroup().id)]",
+ "nicLoop",
+ "AvSet"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/AvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "BackendVMcopyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/niccopyindex()"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('storageAccountName')).primaryEndpoints.blob]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT995 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT995
new file mode 100644
index 0000000..92cbe0b
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT995
@@ -0,0 +1,383 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-lbrules/azuredeploy.json",
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-lbrules/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903387,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-lbrules/azuredeploy.json",
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-lbrules/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT995",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT995",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "storageAccountName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of storage account"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNameforLBIP": {
+ "type": "string",
+ "metadata": {
+ "description": "DNS for Load Balancer IP"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "myVM",
+ "metadata": {
+ "description": "Prefix to use for VM names"
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2019-Datacenter",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "lbName": {
+ "type": "string",
+ "defaultValue": "myLB",
+ "metadata": {
+ "description": "Load Balancer name"
+ }
+ },
+ "nicNamePrefix": {
+ "type": "string",
+ "defaultValue": "nic",
+ "metadata": {
+ "description": "Network Interface name prefix"
+ }
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "defaultValue": "myPublicIP",
+ "metadata": {
+ "description": "Public IP Name"
+ }
+ },
+ "vnetName": {
+ "type": "string",
+ "defaultValue": "myVNET",
+ "metadata": {
+ "description": "VNET name"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_D2s_v3",
+ "metadata": {
+ "description": "Size of the VM"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources"
+ }
+ }
+ },
+ "variables": {
+ "storageAccountType": "Standard_LRS",
+ "availabilitySetName": "myAvSet",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet-1",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressType": "Dynamic",
+ "subnetRef": "Microsoft.Network/virtualNetworks/subnets/myVNET/variables (subnetName)",
+ "publicIPAddressID": "Microsoft.Network/publicIPAddresses/myPublicIP",
+ "numberOfInstances": 2
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "GEN-UNIQUE",
+ "apiVersion": "2019-06-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ },
+ "kind": "StorageV2"
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myAvSet",
+ "apiVersion": "2019-12-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 5
+ },
+ "sku": {
+ "name": "Aligned"
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "myVNET",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "niccopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks//myVNET",
+ "Microsoft.Network/loadBalancers//myLB"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVNET/variables (subnetName)"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/myLB/BackendPool1"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/myLB/RDP-VMcopyindex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-05-01",
+ "name": "myLB",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses//myPublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "BackendPool1"
+ }
+ ],
+ "inboundNatRules": [
+ {
+ "name": "RDP-VM0",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50001,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "name": "RDP-VM1",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/LoadBalancerFrontEnd"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 50002,
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ }
+ ],
+ "loadBalancingRules": [
+ {
+ "name": "LBRule",
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/LoadBalancerFrontEnd"
+ },
+ "backendAddressPool": {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/myLB/BackendPool1"
+ },
+ "protocol": "Tcp",
+ "frontendPort": 80,
+ "backendPort": 80,
+ "enableFloatingIP": false,
+ "idleTimeoutInMinutes": 5,
+ "probe": {
+ "id": "Microsoft.Network/loadBalancers/probes/myLB/tcpProbe"
+ }
+ }
+ }
+ ],
+ "probes": [
+ {
+ "name": "tcpProbe",
+ "properties": {
+ "protocol": "Tcp",
+ "port": 80,
+ "intervalInSeconds": 5,
+ "numberOfProbes": 2
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2019-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "myVMcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts//GEN-UNIQUE",
+ "Microsoft.Network/networkInterfaces//niccopyindex()",
+ "Microsoft.Compute/availabilitySets//myAvSet"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_D2s_v3"
+ },
+ "osProfile": {
+ "computerName": "myVMcopyIndex()",
+ "adminUsername": "GEN-UNIQUE",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/niccopyindex()"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(parameters('storageAccountName'), '2019-06-01').primaryEndpoints.blob]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT996 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT996
new file mode 100644
index 0000000..742a830
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT996
@@ -0,0 +1,362 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-natrules/azuredeploy.json",
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-natrules/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903399,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-natrules/azuredeploy.json",
+ "/quickstarts/microsoft.compute/2-vms-loadbalancer-natrules/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT996",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.network/publicipaddresses",
+ "microsoft.network/virtualnetworks",
+ "microsoft.network/loadbalancers",
+ "microsoft.network/networkinterfaces",
+ "microsoft.compute/virtualmachines",
+ "microsoft.network/networksecuritygroups",
+ "microsoft.network/loadbalancers/inboundnatrules",
+ "microsoft.storage/storageaccounts",
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT996",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "adminUsername": {
+ "type": "string",
+ "metadata": {
+ "description": "Admin username"
+ },
+ "value": "kay"
+ },
+ "adminPassword": {
+ "type": "securestring",
+ "metadata": {
+ "description": "Admin password"
+ },
+ "value": "GEN-PASSWORD"
+ },
+ "dnsNameforLBIP": {
+ "type": "string",
+ "defaultValue": "uniqueDnsNameforLBIP",
+ "metadata": {
+ "description": "Unique DNS name"
+ },
+ "value": "GEN-UNIQUE"
+ },
+ "vmNamePrefix": {
+ "type": "string",
+ "defaultValue": "myVM",
+ "metadata": {
+ "description": "VM name prefix"
+ }
+ },
+ "lbName": {
+ "type": "string",
+ "defaultValue": "myLB",
+ "metadata": {
+ "description": "Load Balancer name"
+ }
+ },
+ "nicNamePrefix": {
+ "type": "string",
+ "defaultValue": "nic",
+ "metadata": {
+ "description": "Network Interface Name Prefix"
+ }
+ },
+ "publicIPAddressName": {
+ "type": "string",
+ "defaultValue": "myPublicIP",
+ "metadata": {
+ "description": "Public IP Address Name"
+ }
+ },
+ "vnetName": {
+ "type": "string",
+ "defaultValue": "myVNET",
+ "metadata": {
+ "description": "VNET name"
+ }
+ },
+ "imagePublisher": {
+ "type": "string",
+ "defaultValue": "MicrosoftWindowsServer",
+ "metadata": {
+ "description": "Image Publisher"
+ }
+ },
+ "imageOffer": {
+ "type": "string",
+ "defaultValue": "WindowsServer",
+ "metadata": {
+ "description": "Image Offer"
+ }
+ },
+ "imageSKU": {
+ "type": "string",
+ "defaultValue": "2012-R2-Datacenter",
+ "metadata": {
+ "description": "Image SKU"
+ }
+ },
+ "vmSize": {
+ "type": "string",
+ "defaultValue": "Standard_A1",
+ "allowedValues": [
+ "Standard_A0",
+ "Standard_A1",
+ "Standard_A2",
+ "Standard_A3",
+ "Standard_A4"
+ ],
+ "metadata": {
+ "description": "VM Size"
+ }
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Resource location"
+ }
+ }
+ },
+ "variables": {
+ "storageAccountType": "Standard_LRS",
+ "availabilitySetName": "myAvSet",
+ "addressPrefix": "10.0.0.0/16",
+ "subnetName": "Subnet-1",
+ "subnetPrefix": "10.0.0.0/24",
+ "publicIPAddressType": "Dynamic",
+ "numberOfInstances": 2,
+ "storageAccountName": "[uniqueString(resourceGroup().id)]",
+ "networkSecurityGroupName": "Subnet-1-nsg"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Storage/storageAccounts",
+ "name": "[uniqueString(resourceGroup().id)]",
+ "apiVersion": "2021-01-01",
+ "location": "[resourceGroup().location]",
+ "sku": {
+ "name": "Standard_LRS"
+ }
+ },
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "myAvSet",
+ "apiVersion": "2016-04-30-preview",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 2,
+ "platformUpdateDomainCount": 2,
+ "managed": true
+ }
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/publicIPAddresses",
+ "name": "myPublicIP",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "publicIPAllocationMethod": "Dynamic",
+ "dnsSettings": {
+ "domainNameLabel": "GEN-UNIQUE"
+ }
+ }
+ },
+ {
+ "comments": "Simple Network Security Group for subnet [variables('subnetName')]",
+ "type": "Microsoft.Network/networkSecurityGroups",
+ "apiVersion": "2019-08-01",
+ "name": "Subnet-1-nsg",
+ "location": "[resourceGroup().location]",
+ "properties": {}
+ },
+ {
+ "apiVersion": "2015-06-15",
+ "type": "Microsoft.Network/virtualNetworks",
+ "name": "myVNET",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/networkSecurityGroups/Subnet-1-nsg"
+ ],
+ "properties": {
+ "addressSpace": {
+ "addressPrefixes": [
+ "10.0.0.0/16"
+ ]
+ },
+ "subnets": [
+ {
+ "name": "Subnet-1",
+ "properties": {
+ "addressPrefix": "10.0.0.0/24",
+ "networkSecurityGroup": {
+ "id": "Microsoft.Network/networkSecurityGroups/Subnet-1-nsg"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/networkInterfaces",
+ "name": "niccopyindex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "nicLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/virtualNetworks/myVNET",
+ "Microsoft.Network/loadBalancers/myLB",
+ "Microsoft.Network/loadBalancers/inboundNatRules/myLB/RDP-VMcopyIndex()"
+ ],
+ "properties": {
+ "ipConfigurations": [
+ {
+ "name": "ipconfig1",
+ "properties": {
+ "privateIPAllocationMethod": "Dynamic",
+ "subnet": {
+ "id": "Microsoft.Network/virtualNetworks/subnets/myVNET/variables (subnetName)"
+ },
+ "loadBalancerBackendAddressPools": [
+ {
+ "id": "Microsoft.Network/loadBalancers/backendAddressPools/myLB/LoadBalancerBackend"
+ }
+ ],
+ "loadBalancerInboundNatRules": [
+ {
+ "id": "Microsoft.Network/loadBalancers/inboundNatRules/myLB/RDP-VMcopyIndex()"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "name": "myLB",
+ "type": "Microsoft.Network/loadBalancers",
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Network/publicIPAddresses/myPublicIP"
+ ],
+ "properties": {
+ "frontendIPConfigurations": [
+ {
+ "name": "LoadBalancerFrontend",
+ "properties": {
+ "publicIPAddress": {
+ "id": "Microsoft.Network/publicIPAddresses/myPublicIP"
+ }
+ }
+ }
+ ],
+ "backendAddressPools": [
+ {
+ "name": "LoadBalancerBackend"
+ }
+ ]
+ }
+ },
+ {
+ "apiVersion": "2020-11-01",
+ "type": "Microsoft.Network/loadBalancers/inboundNatRules",
+ "name": "myLB/RDP-VMcopyIndex()",
+ "location": "[resourceGroup().location]",
+ "copy": {
+ "name": "lbNatLoop",
+ "count": 2
+ },
+ "dependsOn": [
+ "Microsoft.Network/loadBalancers/myLB"
+ ],
+ "properties": {
+ "frontendIPConfiguration": {
+ "id": "Microsoft.Network/loadBalancers/frontendIPConfigurations/myLB/loadBalancerFrontend"
+ },
+ "protocol": "Tcp",
+ "frontendPort": "[copyIndex(5000)]",
+ "backendPort": 3389,
+ "enableFloatingIP": false
+ }
+ },
+ {
+ "apiVersion": "2020-12-01",
+ "type": "Microsoft.Compute/virtualMachines",
+ "name": "myVMcopyindex()",
+ "copy": {
+ "name": "virtualMachineLoop",
+ "count": 2
+ },
+ "location": "[resourceGroup().location]",
+ "dependsOn": [
+ "Microsoft.Storage/storageAccounts/[uniqueString(resourceGroup().id)]",
+ "Microsoft.Network/networkInterfaces/niccopyindex()",
+ "Microsoft.Compute/availabilitySets/myAvSet"
+ ],
+ "properties": {
+ "availabilitySet": {
+ "id": "Microsoft.Compute/availabilitySets/myAvSet"
+ },
+ "hardwareProfile": {
+ "vmSize": "Standard_A1"
+ },
+ "osProfile": {
+ "computerName": "myVMcopyIndex()",
+ "adminUsername": "kay",
+ "adminPassword": "GEN-PASSWORD"
+ },
+ "storageProfile": {
+ "imageReference": {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ },
+ "osDisk": {
+ "createOption": "FromImage"
+ }
+ },
+ "networkProfile": {
+ "networkInterfaces": [
+ {
+ "id": "Microsoft.Network/networkInterfaces/niccopyindex()"
+ }
+ ]
+ },
+ "diagnosticsProfile": {
+ "bootDiagnostics": {
+ "enabled": true,
+ "storageUri": "[reference(variables('storageAccountName'), '2021-01-01').primaryEndpoints.blob]"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT997 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT997
new file mode 100644
index 0000000..d728ff2
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT997
@@ -0,0 +1,56 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/availability-set-create-3FDs-20UDs/azuredeploy.json",
+ "/quickstarts/microsoft.compute/availability-set-create-3FDs-20UDs/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903409,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/availability-set-create-3FDs-20UDs/azuredeploy.json",
+ "/quickstarts/microsoft.compute/availability-set-create-3FDs-20UDs/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT997",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/availabilitysets"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT997",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/availabilitySets",
+ "name": "availabilitySet1",
+ "apiVersion": "2020-06-01",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "platformFaultDomainCount": 3,
+ "platformUpdateDomainCount": 20
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT998 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT998
new file mode 100644
index 0000000..ab56d68
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT998
@@ -0,0 +1,130 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/azuredeploy.json",
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903415,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/azuredeploy.json",
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT998",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.resources/deployments"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT998",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vhdUri": {
+ "type": "string",
+ "metadata": {
+ "description": "Storage VHD Uri"
+ },
+ "value": "vhdUri"
+ },
+ "managedDiskName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the managed disk to be copied"
+ },
+ "value": "MyManagedDisk"
+ },
+ "keyVaultResourceID": {
+ "type": "string",
+ "metadata": {
+ "description": "KeyVault resource id. Ex: /subscriptions/subscriptionid/resourceGroups/contosorg/providers/Microsoft.KeyVault/vaults/contosovault"
+ },
+ "value": "keyVaultResourceID"
+ },
+ "keyVaultSecretUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "KeyVault secret Url. Ex: https://contosovault.vault.azure.net/secrets/contososecret/e088818e865e48488cf363af16dea596"
+ },
+ "value": "KeyVaultSecretUrl"
+ },
+ "useExistingKek": {
+ "type": "string",
+ "defaultValue": "nokek",
+ "allowedValues": [
+ "nokek",
+ "kek"
+ ],
+ "metadata": {
+ "description": "Select kek if the secret is encrypted with a key encryption key and pass explicit keyVaultKekUrl. For nokek, you can keep keyVaultKekUrl empty."
+ },
+ "value": "kek"
+ },
+ "kekUrl": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "key encryption key Url. Ex: https://contosovault.vault.azure.net/keys/contosokek/562a4bb76b524a1493a6afe8e536ee78"
+ },
+ "value": "FullVersionedKekUrl"
+ },
+ "kekVaultResourceID": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "key encryption key vault resource id. Ex: /subscriptions/subscriptionid/resourceGroups/contosorg/providers/Microsoft.KeyVault/vaults/contosovault"
+ },
+ "value": "KekVaultResourceId"
+ }
+ },
+ "variables": {
+ "createDiskUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-create-encrypted-managed-disk/CreateEncryptedManagedDisk-kek.json"
+ },
+ "resources": [
+ {
+ "name": "CreateEncryptedManagedDisk",
+ "type": "Microsoft.Resources/deployments",
+ "apiVersion": "2015-01-01",
+ "properties": {
+ "mode": "Incremental",
+ "templateLink": {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-create-encrypted-managed-disk/CreateEncryptedManagedDisk-kek.json",
+ "contentVersion": "1.0.0.0"
+ },
+ "parameters": {
+ "vhdUri": {
+ "value": "vhdUri"
+ },
+ "managedDiskName": {
+ "value": "MyManagedDisk"
+ },
+ "keyVaultResourceID": {
+ "value": "keyVaultResourceID"
+ },
+ "keyVaultSecretUrl": {
+ "value": "KeyVaultSecretUrl"
+ },
+ "kekUrl": {
+ "value": "FullVersionedKekUrl"
+ },
+ "kekVaultResourceID": {
+ "value": "KekVaultResourceId"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT999 b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT999
new file mode 100644
index 0000000..735e753
--- /dev/null
+++ b/validation/scenario-azure-quickStart/snapshots/ARM_TEMPLATE_SNAPSHOT999
@@ -0,0 +1,127 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "master",
+ "contentType": "json",
+ "source": "gitConnectorAzureQuickStart",
+ "paths": [
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/CreateEncryptedManagedDisk-kek.json",
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/azuredeploy.parameters.json"
+ ],
+ "timestamp": 1642962903424,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "ARM_TEMPLATE_SNAPSHOT",
+ "type": "arm",
+ "collection": "armtemplate",
+ "paths": [
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/CreateEncryptedManagedDisk-kek.json",
+ "/quickstarts/microsoft.compute/create-encrypted-managed-disk/azuredeploy.parameters.json"
+ ],
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT999",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "microsoft.compute/disks"
+ ]
+ },
+ "snapshotId": "ARM_TEMPLATE_SNAPSHOT999",
+ "collection": "armtemplate",
+ "json": {
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "vhdUri": {
+ "type": "string",
+ "metadata": {
+ "description": "Storage VHD Uri"
+ },
+ "value": "vhdUri"
+ },
+ "managedDiskName": {
+ "type": "string",
+ "metadata": {
+ "description": "Name of the managed disk to be copied"
+ },
+ "value": "MyManagedDisk"
+ },
+ "keyVaultResourceID": {
+ "type": "string",
+ "metadata": {
+ "description": "KeyVault resource id. Ex: /subscriptions/subscriptionid/resourceGroups/contosorg/providers/Microsoft.KeyVault/vaults/contosovault"
+ },
+ "value": "keyVaultResourceID"
+ },
+ "keyVaultSecretUrl": {
+ "type": "string",
+ "metadata": {
+ "description": "KeyVault secret Url. Ex: https://contosovault.vault.azure.net/secrets/contososecret/e088818e865e48488cf363af16dea596"
+ },
+ "value": "KeyVaultSecretUrl"
+ },
+ "kekUrl": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "KeyVault key encryption key Url. Ex: https://contosovault.vault.azure.net/keys/contosokek/562a4bb76b524a1493a6afe8e536ee78"
+ },
+ "value": "FullVersionedKekUrl"
+ },
+ "kekVaultResourceID": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
+ "description": "KekVault resource id. Ex: /subscriptions/subscriptionid/resourceGroups/contosorg/providers/Microsoft.KeyVault/vaults/contosovault"
+ },
+ "value": "KekVaultResourceId"
+ },
+ "location": {
+ "type": "string",
+ "defaultValue": "[resourceGroup().location]",
+ "metadata": {
+ "description": "Location for all resources."
+ }
+ },
+ "useExistingKek": {
+ "value": "kek"
+ }
+ },
+ "variables": {
+ "location": "[resourceGroup().location]",
+ "storageAccountType": "Standard_LRS",
+ "diskSzie": "128"
+ },
+ "resources": [
+ {
+ "apiVersion": "2016-04-30-preview",
+ "type": "Microsoft.Compute/disks",
+ "name": "MyManagedDisk",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "creationData": {
+ "createOption": "Import",
+ "sourceUri": "vhdUri"
+ },
+ "accountType": "Standard_LRS",
+ "diskSizeGB": "128",
+ "encryptionSettings": {
+ "enabled": true,
+ "diskEncryptionKey": {
+ "sourceVault": {
+ "id": "keyVaultResourceID"
+ },
+ "secretUrl": "KeyVaultSecretUrl"
+ },
+ "keyEncryptionKey": {
+ "sourceVault": {
+ "id": "KekVaultResourceId"
+ },
+ "keyUrl": "FullVersionedKekUrl"
+ }
+ }
+ }
+ }
+ ],
+ "\uff04schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/master-snapshot.json b/validation/scenario-azure-terraform-hashicorp/master-snapshot.json
new file mode 100644
index 0000000..cb8c955
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/master-snapshot.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "",
+ "contentVersion": "1.0.0.0",
+ "fileType": "masterSnapshot",
+ "connector": "gitConnectorRemote",
+ "remoteFile": "azure/terraform/master-snapshot.json",
+ "connectorUsers": [
+ {
+ "id": "USER_1",
+ "testUser": "Shahin",
+ "source": "gitConnectorAzureTerraHashicorp"
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/master-snapshot_gen.json b/validation/scenario-azure-terraform-hashicorp/master-snapshot_gen.json
new file mode 100644
index 0000000..d36b15f
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/master-snapshot_gen.json
@@ -0,0 +1,4289 @@
+{
+ "$schema": "",
+ "contentVersion": "1.0.0.0",
+ "fileType": "snapshot",
+ "snapshots": [
+ {
+ "type": "filesystem",
+ "connectorUser": "USER_1",
+ "nodes": [
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/api-management/outputs.tf",
+ "/examples/api-management/variables.tf",
+ "/examples/api-management/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT1",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_api_management_product",
+ "azurerm_api_management_api",
+ "azurerm_resource_group",
+ "azurerm_api_management",
+ "azurerm_api_management_group",
+ "azurerm_api_management_product_api",
+ "azurerm_api_management_product_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/backup/output.tf",
+ "/examples/app-service/backup/variables.tf",
+ "/examples/app-service/backup/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT2",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_app_service_plan",
+ "azurerm_storage_container",
+ "azurerm_storage_account",
+ "azurerm_app_service"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/docker-authentication/outputs.tf",
+ "/examples/app-service/docker-authentication/variables.tf",
+ "/examples/app-service/docker-authentication/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT3",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/docker-basic/outputs.tf",
+ "/examples/app-service/docker-basic/variables.tf",
+ "/examples/app-service/docker-basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT4",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/docker-compose/outputs.tf",
+ "/examples/app-service/docker-compose/variables.tf",
+ "/examples/app-service/docker-compose/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT5",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/docker-kubernetes/outputs.tf",
+ "/examples/app-service/docker-kubernetes/variables.tf",
+ "/examples/app-service/docker-kubernetes/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT6",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/function-azure-RBAC-role-assignment/outputs.tf",
+ "/examples/app-service/function-azure-RBAC-role-assignment/variables.tf",
+ "/examples/app-service/function-azure-RBAC-role-assignment/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT7",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_app_service_plan",
+ "azurerm_role_assignment",
+ "azurerm_storage_account",
+ "azurerm_function_app",
+ "azurerm_application_insights"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/function-basic/outputs.tf",
+ "/examples/app-service/function-basic/variables.tf",
+ "/examples/app-service/function-basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT8",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_application_insights",
+ "azurerm_resource_group",
+ "azurerm_app_service_plan",
+ "azurerm_storage_account",
+ "azurerm_function_app"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/function-python/vars.tf",
+ "/examples/app-service/function-python/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT9",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_resource_group",
+ "azurerm_storage_account",
+ "azurerm_function_app"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-authentication/outputs.tf",
+ "/examples/app-service/linux-authentication/variables.tf",
+ "/examples/app-service/linux-authentication/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT10",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-basic/outputs.tf",
+ "/examples/app-service/linux-basic/variables.tf",
+ "/examples/app-service/linux-basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT11",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-nodejs/outputs.tf",
+ "/examples/app-service/linux-nodejs/variables.tf",
+ "/examples/app-service/linux-nodejs/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT12",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-php/outputs.tf",
+ "/examples/app-service/linux-php/variables.tf",
+ "/examples/app-service/linux-php/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT13",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-authentication/outputs.tf",
+ "/examples/app-service/windows-authentication/variables.tf",
+ "/examples/app-service/windows-authentication/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT14",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-basic/outputs.tf",
+ "/examples/app-service/windows-basic/variables.tf",
+ "/examples/app-service/windows-basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT15",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-container/outputs.tf",
+ "/examples/app-service/windows-container/variables.tf",
+ "/examples/app-service/windows-container/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT16",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-java/outputs.tf",
+ "/examples/app-service/windows-java/variables.tf",
+ "/examples/app-service/windows-java/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT17",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-certificate/stored-in-keyvault/variables.tf",
+ "/examples/app-service-certificate/stored-in-keyvault/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT18",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_certificate",
+ "azurerm_key_vault",
+ "azurerm_resource_group",
+ "azurerm_key_vault_certificate",
+ "azurerm_key_vault_access_policy"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/examples/app-service-certificate/stored-in-keyvault/certificate.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT19",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-certificate-order/standard/outputs.tf",
+ "/examples/app-service-certificate-order/standard/variables.tf",
+ "/examples/app-service-certificate-order/standard/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT20",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_certificate_order",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-certificate-order/wildcard/outputs.tf",
+ "/examples/app-service-certificate-order/wildcard/variables.tf",
+ "/examples/app-service-certificate-order/wildcard/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT21",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_certificate_order",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-environment-v3/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT22",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_environment_v3",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/automation-account/outputs.tf",
+ "/examples/automation-account/variables.tf",
+ "/examples/automation-account/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT23",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_automation_job_schedule",
+ "azurerm_automation_runbook",
+ "azurerm_resource_group",
+ "azurerm_automation_account",
+ "azurerm_automation_schedule"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/azure-monitoring/eventhub_integration/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT24",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_eventhub_namespace",
+ "azurerm_resource_group",
+ "azurerm_eventhub_namespace_authorization_rule",
+ "azurerm_eventhub",
+ "azurerm_monitor_diagnostic_setting"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/azure-monitoring/redis-cache-monitor/variables.tf",
+ "/examples/azure-monitoring/redis-cache-monitor/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT25",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_monitor_action_group",
+ "azurerm_monitor_metric_alert",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/batch/basic/variables.tf",
+ "/examples/batch/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT26",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_batch_account",
+ "azurerm_resource_group",
+ "azurerm_batch_pool"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/batch/custom-image/variables.tf",
+ "/examples/batch/custom-image/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT27",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_batch_account",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_batch_pool",
+ "azurerm_storage_container",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_storage_account",
+ "azurerm_image"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/bot-channel/variables.tf",
+ "/examples/bot-channel/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT28",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_bot_channels_registration",
+ "azurerm_resource_group",
+ "azurerm_bot_channel_directline"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/cdn/outputs.tf",
+ "/examples/cdn/variables.tf",
+ "/examples/cdn/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT29",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_resource_group",
+ "azurerm_cdn_endpoint",
+ "azurerm_cdn_profile"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/container-instance/image-registry-credentials/variables.tf",
+ "/examples/container-instance/image-registry-credentials/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT30",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_container_group",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/container-instance/multiple-containers/outputs.tf",
+ "/examples/container-instance/multiple-containers/variables.tf",
+ "/examples/container-instance/multiple-containers/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT31",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_container_group",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/container-instance/network-profile/variables.tf",
+ "/examples/container-instance/network-profile/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT32",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_container_group",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_profile"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/container-instance/volume-mount/outputs.tf",
+ "/examples/container-instance/volume-mount/variables.tf",
+ "/examples/container-instance/volume-mount/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT33",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_container_group",
+ "azurerm_storage_account",
+ "azurerm_resource_group",
+ "azurerm_storage_share"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/container-registry/outputs.tf",
+ "/examples/container-registry/variables.tf",
+ "/examples/container-registry/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT34",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_container_registry"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/cosmos-db/basic/outputs.tf",
+ "/examples/cosmos-db/basic/variables.tf",
+ "/examples/cosmos-db/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT35",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_cosmosdb_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/cosmos-db/customer-managed-key/outputs.tf",
+ "/examples/cosmos-db/customer-managed-key/variables.tf",
+ "/examples/cosmos-db/customer-managed-key/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT36",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_key",
+ "azurerm_cosmosdb_account",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/cosmos-db/failover/outputs.tf",
+ "/examples/cosmos-db/failover/variables.tf",
+ "/examples/cosmos-db/failover/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT37",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_cosmosdb_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/data-factory/shared-self-hosted/variables.tf",
+ "/examples/data-factory/shared-self-hosted/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT38",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_data_factory_integration_runtime_self_hosted",
+ "azurerm_mssql_virtual_machine",
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_subnet_network_security_group_association",
+ "azurerm_network_interface",
+ "azurerm_role_assignment",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_security_group",
+ "azurerm_network_interface_security_group_association",
+ "azurerm_data_factory",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/databricks/customer-managed-key/dbfs/variables.tf",
+ "/examples/databricks/customer-managed-key/dbfs/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT39",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_key",
+ "azurerm_resource_group",
+ "azurerm_databricks_workspace",
+ "azurerm_key_vault_access_policy",
+ "azurerm_databricks_workspace_customer_managed_key"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/databricks/customer-managed-key/managed-services/variables.tf",
+ "/examples/databricks/customer-managed-key/managed-services/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT40",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_key",
+ "azurerm_resource_group",
+ "azurerm_databricks_workspace",
+ "azurerm_key_vault_access_policy"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/databricks/secure-connectivity-cluster/with-load-balancer/variables.tf",
+ "/examples/databricks/secure-connectivity-cluster/with-load-balancer/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT41",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_subnet",
+ "azurerm_lb_outbound_rule",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_databricks_workspace",
+ "azurerm_public_ip",
+ "azurerm_network_security_group",
+ "azurerm_subnet_network_security_group_association",
+ "azurerm_lb"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/databricks/secure-connectivity-cluster/without-load-balancer/variables.tf",
+ "/examples/databricks/secure-connectivity-cluster/without-load-balancer/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT42",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_databricks_workspace",
+ "azurerm_network_security_group",
+ "azurerm_subnet_network_security_group_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/datalake/variables.tf",
+ "/examples/datalake/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT43",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_data_lake_store",
+ "azurerm_data_lake_store_firewall_rule",
+ "azurerm_resource_group",
+ "azurerm_data_lake_analytics_firewall_rule",
+ "azurerm_data_lake_analytics_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/desktopvirtualization/variables.tf",
+ "/examples/desktopvirtualization/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT44",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_desktop_application_group",
+ "azurerm_virtual_desktop_host_pool",
+ "azurerm_virtual_desktop_workspace_application_group_association",
+ "azurerm_resource_group",
+ "azurerm_virtual_desktop_workspace"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/eventgrid/event-subscription/variables.tf",
+ "/examples/eventgrid/event-subscription/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT45",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_eventgrid_event_subscription",
+ "azurerm_resource_group",
+ "azurerm_storage_container",
+ "azurerm_storage_blob",
+ "azurerm_storage_account",
+ "azurerm_storage_queue"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/eventhub/dedicated-eventhubs-cluster/variables.tf",
+ "/examples/eventhub/dedicated-eventhubs-cluster/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT46",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_eventhub_namespace",
+ "azurerm_eventhub",
+ "azurerm_resource_group",
+ "azurerm_eventhub_cluster"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/eventhub/shared-parent-eventhub-namespace/variables.tf",
+ "/examples/eventhub/shared-parent-eventhub-namespace/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT47",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_eventhub_namespace",
+ "azurerm_eventhub_authorization_rule",
+ "azurerm_resource_group",
+ "azurerm_eventhub_consumer_group",
+ "azurerm_eventhub_namespace_authorization_rule",
+ "azurerm_eventhub"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/hdinsight/enterprise-security-package/providers.tf",
+ "/examples/hdinsight/enterprise-security-package/variables.tf",
+ "/examples/hdinsight/enterprise-security-package/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT48",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azuread_group",
+ "azurerm_storage_account",
+ "azurerm_role_assignment",
+ "azurerm_storage_container",
+ "azuread_group_member",
+ "azurerm_virtual_network_dns_servers",
+ "azuread_user",
+ "azurerm_hdinsight_hadoop_cluster",
+ "azurerm_network_security_group",
+ "azurerm_subnet_network_security_group_association",
+ "azurerm_active_directory_domain_service",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/hdinsight/private-link/hadoop-interactive-spark-hbase-cluster/variables.tf",
+ "/examples/hdinsight/private-link/hadoop-interactive-spark-hbase-cluster/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT49",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_subnet_nat_gateway_association",
+ "azurerm_storage_account",
+ "azurerm_role_assignment",
+ "azurerm_nat_gateway",
+ "azurerm_nat_gateway_public_ip_association",
+ "azurerm_public_ip",
+ "azurerm_hdinsight_hadoop_cluster",
+ "azurerm_network_security_group",
+ "azurerm_subnet_network_security_group_association",
+ "azurerm_storage_data_lake_gen2_filesystem",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/aci_connector_linux/outputs.tf",
+ "/examples/kubernetes/aci_connector_linux/vars.tf",
+ "/examples/kubernetes/aci_connector_linux/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT50",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group",
+ "azurerm_virtual_network",
+ "azurerm_role_assignment"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/basic-cluster/outputs.tf",
+ "/examples/kubernetes/basic-cluster/variables.tf",
+ "/examples/kubernetes/basic-cluster/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT51",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/egress-with-udr-azure-cni/outputs.tf",
+ "/examples/kubernetes/egress-with-udr-azure-cni/variables.tf",
+ "/examples/kubernetes/egress-with-udr-azure-cni/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT52",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_route_table",
+ "azurerm_subnet_route_table_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/egress-with-udr-kubenet/outputs.tf",
+ "/examples/kubernetes/egress-with-udr-kubenet/variables.tf",
+ "/examples/kubernetes/egress-with-udr-kubenet/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT53",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_role_assignment",
+ "azurerm_route_table",
+ "azurerm_subnet_route_table_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/monitoring-log-analytics/outputs.tf",
+ "/examples/kubernetes/monitoring-log-analytics/variables.tf",
+ "/examples/kubernetes/monitoring-log-analytics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT54",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group",
+ "azurerm_log_analytics_workspace",
+ "azurerm_log_analytics_solution"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/network-policy-calico/outputs.tf",
+ "/examples/kubernetes/network-policy-calico/variables.tf",
+ "/examples/kubernetes/network-policy-calico/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT55",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group",
+ "azurerm_virtual_network",
+ "azurerm_kubernetes_cluster_node_pool"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/nodes-on-internal-network/outputs.tf",
+ "/examples/kubernetes/nodes-on-internal-network/variables.tf",
+ "/examples/kubernetes/nodes-on-internal-network/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT56",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group",
+ "azurerm_virtual_network",
+ "azurerm_kubernetes_cluster_node_pool"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/old/advanced-networking/outputs.tf",
+ "/examples/kubernetes/old/advanced-networking/variables.tf",
+ "/examples/kubernetes/old/advanced-networking/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT57",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_route_table",
+ "azurerm_subnet_route_table_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/old/advanced-networking-calico-policy/outputs.tf",
+ "/examples/kubernetes/old/advanced-networking-calico-policy/variables.tf",
+ "/examples/kubernetes/old/advanced-networking-calico-policy/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT58",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_route_table",
+ "azurerm_subnet_route_table_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/old/role-based-access-control/outputs.tf",
+ "/examples/kubernetes/old/role-based-access-control/variables.tf",
+ "/examples/kubernetes/old/role-based-access-control/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT59",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/old/role-based-access-control-azuread/outputs.tf",
+ "/examples/kubernetes/old/role-based-access-control-azuread/variables.tf",
+ "/examples/kubernetes/old/role-based-access-control-azuread/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT60",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/private-api-server/outputs.tf",
+ "/examples/kubernetes/private-api-server/variables.tf",
+ "/examples/kubernetes/private-api-server/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT61",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/public-ip/outputs.tf",
+ "/examples/kubernetes/public-ip/variables.tf",
+ "/examples/kubernetes/public-ip/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT62",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group",
+ "azurerm_virtual_network"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/kubernetes/spot-node-pool/outputs.tf",
+ "/examples/kubernetes/spot-node-pool/variables.tf",
+ "/examples/kubernetes/spot-node-pool/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT63",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_kubernetes_cluster",
+ "azurerm_resource_group",
+ "azurerm_kubernetes_cluster_node_pool"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/log-analytics/basic/variables.tf",
+ "/examples/log-analytics/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT64",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_log_analytics_workspace"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/log-analytics/solution/variables.tf",
+ "/examples/log-analytics/solution/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT65",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_log_analytics_workspace",
+ "azurerm_log_analytics_solution"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/logic-app/variables.tf",
+ "/examples/logic-app/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT66",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_logic_app_trigger_recurrence",
+ "azurerm_logic_app_workflow",
+ "azurerm_resource_group",
+ "azurerm_logic_app_action_http"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/managed-application/application-definition/variables.tf",
+ "/examples/managed-application/application-definition/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT67",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_managed_application_definition"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/managed-disks/encrypted/variables.tf",
+ "/examples/managed-disks/encrypted/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT68",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/managed-disks/encrypted/variables.tf",
+ "/examples/managed-disks/encrypted/2-soft-delete.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT69",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "null_resource"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/managed-disks/encrypted/variables.tf",
+ "/examples/managed-disks/encrypted/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT70",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_disk_encryption_set",
+ "azurerm_key_vault_key",
+ "azurerm_role_assignment",
+ "azurerm_key_vault_access_policy",
+ "azurerm_managed_disk"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/media-services/basic/variables.tf",
+ "/examples/media-services/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT71",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_media_services_account",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/media-services/basic-with-assets/variables.tf",
+ "/examples/media-services/basic-with-assets/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT72",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_media_services_account",
+ "azurerm_resource_group",
+ "azurerm_media_asset"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/media-services/multiple-storage-accounts/variables.tf",
+ "/examples/media-services/multiple-storage-accounts/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT73",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_media_services_account",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/mssql/mssqlvm/variables.tf",
+ "/examples/mssql/mssqlvm/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT74",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_subnet_network_security_group_association",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_security_group",
+ "azurerm_network_interface_security_group_association",
+ "azurerm_mssql_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/account/variables.tf",
+ "/examples/netapp/account/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT75",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_netapp_account",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/nfsv3_volume_with_snapshot_policy/variables.tf",
+ "/examples/netapp/nfsv3_volume_with_snapshot_policy/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT76",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_netapp_snapshot_policy",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_netapp_pool",
+ "azurerm_netapp_account",
+ "azurerm_netapp_volume"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/pool/variables.tf",
+ "/examples/netapp/pool/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT77",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_netapp_account",
+ "azurerm_resource_group",
+ "azurerm_netapp_pool"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/snapshot/variables.tf",
+ "/examples/netapp/snapshot/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT78",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_netapp_snapshot",
+ "azurerm_netapp_pool",
+ "azurerm_netapp_account",
+ "azurerm_netapp_volume"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/volume/variables.tf",
+ "/examples/netapp/volume/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT79",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_netapp_pool",
+ "azurerm_netapp_account",
+ "azurerm_netapp_volume"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/volume_crr/variables.tf",
+ "/examples/netapp/volume_crr/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT80",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_netapp_pool",
+ "azurerm_netapp_account",
+ "azurerm_netapp_volume"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/volume_dual_protocol/variables.tf",
+ "/examples/netapp/volume_dual_protocol/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT81",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_netapp_account",
+ "azurerm_resource_group",
+ "azurerm_netapp_pool",
+ "azurerm_netapp_volume"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/netapp/volume_from_snapshot/variables.tf",
+ "/examples/netapp/volume_from_snapshot/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT82",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_netapp_snapshot",
+ "azurerm_netapp_pool",
+ "azurerm_netapp_account",
+ "azurerm_netapp_volume"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/policy-definition/variables.tf",
+ "/examples/policy-definition/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT83",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_policy_definition"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/private-endpoint/application-gateway/variables.tf",
+ "/examples/private-endpoint/application-gateway/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT84",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_private_endpoint",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_application_gateway",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/private-endpoint/cosmos-db/variables.tf",
+ "/examples/private-endpoint/cosmos-db/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT85",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_private_endpoint",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_cosmosdb_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/private-endpoint/databricks/managed-services/variables.tf",
+ "/examples/private-endpoint/databricks/managed-services/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT86",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_private_endpoint",
+ "azurerm_private_dns_zone",
+ "azurerm_key_vault",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_key_vault_key",
+ "azurerm_databricks_workspace",
+ "azurerm_key_vault_access_policy",
+ "azurerm_private_dns_cname_record",
+ "azurerm_databricks_workspace_customer_managed_key",
+ "azurerm_network_security_group",
+ "azurerm_subnet_network_security_group_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/private-endpoint/databricks/private-endpoint/variables.tf",
+ "/examples/private-endpoint/databricks/private-endpoint/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT87",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_private_endpoint",
+ "azurerm_private_dns_zone",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_databricks_workspace",
+ "azurerm_private_dns_cname_record",
+ "azurerm_network_security_group",
+ "azurerm_subnet_network_security_group_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/private-endpoint/postgresql/variables.tf",
+ "/examples/private-endpoint/postgresql/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT88",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_postgresql_server",
+ "azurerm_private_endpoint",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/private-endpoint/private-dns-group/variables.tf",
+ "/examples/private-endpoint/private-dns-group/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT89",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_postgresql_server",
+ "azurerm_private_endpoint",
+ "azurerm_private_dns_zone",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/private-endpoint/private-link-service/variables.tf",
+ "/examples/private-endpoint/private-link-service/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT90",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_private_endpoint",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_private_link_service",
+ "azurerm_public_ip",
+ "azurerm_lb"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/recovery-services/advanced-policy/variables.tf",
+ "/examples/recovery-services/advanced-policy/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT91",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_recovery_services_vault",
+ "azurerm_resource_group",
+ "azurerm_backup_policy_vm"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/recovery-services/basic/variables.tf",
+ "/examples/recovery-services/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT92",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_recovery_services_vault",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/recovery-services/virtual-machine/variables.tf",
+ "/examples/recovery-services/virtual-machine/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT93",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_recovery_services_vault",
+ "azurerm_virtual_machine",
+ "azurerm_backup_policy_vm",
+ "azurerm_backup_protected_vm"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/redis-cache/basic/variables.tf",
+ "/examples/redis-cache/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT94",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_redis_cache",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/redis-cache/premium-with-backup/variables.tf",
+ "/examples/redis-cache/premium-with-backup/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT95",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_redis_cache",
+ "azurerm_storage_account",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/redis-cache/premium-with-clustering/variables.tf",
+ "/examples/redis-cache/premium-with-clustering/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT96",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_redis_cache",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/redis-cache/standard/variables.tf",
+ "/examples/redis-cache/standard/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT97",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_redis_cache",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/search/outputs.tf",
+ "/examples/search/variables.tf",
+ "/examples/search/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT98",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_search_service"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/security/securitycenter-pricing/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT99",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_security_center_subscription_pricing"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/security/securitycenter-setting/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT100",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_security_center_setting"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/0-base.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT101",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/1-keyvault.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT102",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/2-loadbalancer.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT103",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_lb_nat_pool",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/3-servicefabric.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT104",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_service_fabric_cluster",
+ "azurerm_windows_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/servicebus/basic/outputs.tf",
+ "/examples/servicebus/basic/variables.tf",
+ "/examples/servicebus/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT105",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_servicebus_topic",
+ "azurerm_servicebus_queue",
+ "azurerm_resource_group",
+ "azurerm_servicebus_namespace_authorization_rule",
+ "azurerm_servicebus_subscription",
+ "azurerm_servicebus_namespace"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/servicebus/forwarding/outputs.tf",
+ "/examples/servicebus/forwarding/variables.tf",
+ "/examples/servicebus/forwarding/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT106",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_servicebus_topic_authorization_rule",
+ "azurerm_servicebus_topic",
+ "azurerm_resource_group",
+ "azurerm_servicebus_namespace_authorization_rule",
+ "azurerm_servicebus_subscription",
+ "azurerm_servicebus_namespace"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/database/outputs.tf",
+ "/examples/sql-azure/database/variables.tf",
+ "/examples/sql-azure/database/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT107",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_sql_server",
+ "azurerm_resource_group",
+ "azurerm_sql_database",
+ "azurerm_sql_firewall_rule"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/failover_group/variables.tf",
+ "/examples/sql-azure/failover_group/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT108",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_mssql_server",
+ "azurerm_resource_group",
+ "azurerm_sql_failover_group",
+ "azurerm_mssql_database"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/managed_instance_failover_group/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT109",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_sql_managed_instance_failover_group",
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_subnet_network_security_group_association",
+ "azurerm_virtual_network_gateway",
+ "azurerm_sql_managed_instance",
+ "azurerm_route_table",
+ "azurerm_public_ip",
+ "azurerm_virtual_network_gateway_connection",
+ "azurerm_network_security_group",
+ "azurerm_subnet_route_table_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/sql_auditing_eventhub/variables.tf",
+ "/examples/sql-azure/sql_auditing_eventhub/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT110",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_eventhub_namespace",
+ "azurerm_mssql_server",
+ "azurerm_resource_group",
+ "azurerm_eventhub_namespace_authorization_rule",
+ "azurerm_eventhub",
+ "azurerm_mssql_server_extended_auditing_policy",
+ "azurerm_mssql_database",
+ "azurerm_monitor_diagnostic_setting",
+ "azurerm_mssql_database_extended_auditing_policy"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/sql_auditing_log_analytics/variables.tf",
+ "/examples/sql-azure/sql_auditing_log_analytics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT111",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_mssql_server",
+ "azurerm_log_analytics_workspace",
+ "azurerm_resource_group",
+ "azurerm_mssql_server_extended_auditing_policy",
+ "azurerm_mssql_database",
+ "azurerm_monitor_diagnostic_setting",
+ "azurerm_mssql_database_extended_auditing_policy"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage-account/variables.tf",
+ "/examples/storage/storage-account/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT112",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage-container/variables.tf",
+ "/examples/storage/storage-container/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT113",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_storage_container",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage-share/variables.tf",
+ "/examples/storage/storage-share/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT114",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_resource_group",
+ "azurerm_storage_share"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage_adls_acls/variables.tf",
+ "/examples/storage/storage_adls_acls/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT115",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_role_assignment",
+ "azurerm_storage_data_lake_gen2_path",
+ "azurerm_storage_account",
+ "azurerm_storage_data_lake_gen2_filesystem",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/stream-analytics/variables.tf",
+ "/examples/stream-analytics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT116",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_storage_container",
+ "azurerm_stream_analytics_job",
+ "azurerm_storage_account",
+ "azurerm_stream_analytics_reference_input_blob"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/traffic-manager/basic/variables.tf",
+ "/examples/traffic-manager/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT117",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_traffic_manager_profile",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/traffic-manager/virtual-machine/outputs.tf",
+ "/examples/traffic-manager/virtual-machine/variables.tf",
+ "/examples/traffic-manager/virtual-machine/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT118",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_traffic_manager_endpoint",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_traffic_manager_profile",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/traffic-manager/vm-scale-set/variables.tf",
+ "/examples/traffic-manager/vm-scale-set/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT119",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_traffic_manager_endpoint",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_traffic_manager_profile",
+ "azurerm_virtual_machine_scale_set",
+ "azurerm_lb_probe"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/basic-password/variables.tf",
+ "/examples/virtual-machines/linux/basic-password/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT120",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/basic-ssh/variables.tf",
+ "/examples/virtual-machines/linux/basic-ssh/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT121",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/custom-data/variables.tf",
+ "/examples/virtual-machines/linux/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT122",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/ephemeral-os-disk/variables.tf",
+ "/examples/virtual-machines/linux/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT123",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/load-balanced/variables.tf",
+ "/examples/virtual-machines/linux/load-balanced/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT124",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_network_security_group",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_interface_backend_address_pool_association",
+ "azurerm_lb",
+ "azurerm_lb_nat_rule"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/managed-disk-attachments/variables.tf",
+ "/examples/virtual-machines/linux/managed-disk-attachments/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT125",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine",
+ "azurerm_virtual_machine_data_disk_attachment",
+ "azurerm_managed_disk"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/provisioner/variables.tf",
+ "/examples/virtual-machines/linux/provisioner/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT126",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/public-ip/variables.tf",
+ "/examples/virtual-machines/linux/public-ip/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT127",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_security_group",
+ "azurerm_network_interface_security_group_association"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/variables.tf",
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT128",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_storage_account",
+ "azurerm_network_interface_nat_rule_association",
+ "azurerm_lb_probe",
+ "azurerm_lb_nat_rule"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT129",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_group",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/2-generate-ssh.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT130",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "tls_private_key"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT131",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/variables.tf",
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT132",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_template_deployment",
+ "azurerm_storage_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT133",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT134",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine",
+ "azurerm_virtual_machine_data_disk_attachment",
+ "azurerm_managed_disk"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT135",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT136",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT137",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT138",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT139",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT140",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT141",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT142",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/multiple-network-interfaces/variables.tf",
+ "/examples/virtual-machines/virtual_machine/multiple-network-interfaces/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT143",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_security_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/openshift-origin/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/openshift-origin/variables.tf",
+ "/examples/virtual-machines/virtual_machine/openshift-origin/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT144",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_network_security_group",
+ "azurerm_virtual_machine",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_storage_account",
+ "azurerm_lb_probe",
+ "azurerm_lb_nat_rule"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT145",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT146",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT147",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/2-certificates.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT148",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT149",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/variables.tf",
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT150",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_network_security_group",
+ "azurerm_storage_container",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_storage_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT151",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_storage_container",
+ "azurerm_storage_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT152",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT153",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_storage_account",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/vm-joined-to-active-directory/variables.tf",
+ "/examples/virtual-machines/virtual_machine/vm-joined-to-active-directory/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT154",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "null_resource",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/basic-password/variables.tf",
+ "/examples/virtual-machines/windows/basic-password/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT155",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/custom-data/variables.tf",
+ "/examples/virtual-machines/windows/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT156",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/ephemeral-os-disk/variables.tf",
+ "/examples/virtual-machines/windows/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT157",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-custom-extension/vars.tf",
+ "/examples/virtual-machines/windows/vm-custom-extension/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT158",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-joined-to-active-directory/variables.tf",
+ "/examples/virtual-machines/windows/vm-joined-to-active-directory/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT159",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-role-assignment/vars.tf",
+ "/examples/virtual-machines/windows/vm-role-assignment/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT160",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_role_assignment",
+ "azurerm_storage_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/azure-firewall/variables.tf",
+ "/examples/virtual-networks/azure-firewall/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT161",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "random_string",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_storage_account",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_route_table",
+ "azurerm_public_ip",
+ "azurerm_subnet_route_table_association",
+ "azurerm_network_security_group",
+ "azurerm_network_interface_security_group_association",
+ "azurerm_firewall_network_rule_collection",
+ "azurerm_firewall",
+ "azurerm_firewall_application_rule_collection"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/basic/variables.tf",
+ "/examples/virtual-networks/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT162",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/multiple-subnets/variables.tf",
+ "/examples/virtual-networks/multiple-subnets/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT163",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/network-interface-app-security-group-association/variables.tf",
+ "/examples/virtual-networks/network-interface-app-security-group-association/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT164",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_application_security_group",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_interface_application_security_group_association",
+ "azurerm_network_security_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/network-security-group/variables.tf",
+ "/examples/virtual-networks/network-security-group/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT165",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_security_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/network-security-group-rule/variables.tf",
+ "/examples/virtual-networks/network-security-group-rule/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT166",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_rule",
+ "azurerm_network_security_group",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/private-link-service/variables.tf",
+ "/examples/virtual-networks/private-link-service/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT167",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_private_link_service",
+ "azurerm_public_ip",
+ "azurerm_lb"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-hub/variables.tf",
+ "/examples/virtual-networks/virtual-hub/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT168",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_hub",
+ "azurerm_virtual_wan",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-gateway/basic/variables.tf",
+ "/examples/virtual-networks/virtual-network-gateway/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT169",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_virtual_network_gateway",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-gateway/vpngw1/variables.tf",
+ "/examples/virtual-networks/virtual-network-gateway/vpngw1/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT170",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_virtual_network_gateway",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-peering/variables.tf",
+ "/examples/virtual-networks/virtual-network-peering/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT171",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_virtual_network_peering"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/extensions/custom-script/variables.tf",
+ "/examples/vm-scale-set/extensions/custom-script/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT172",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine_scale_set_extension",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/auto-scaling/variables.tf",
+ "/examples/vm-scale-set/linux/auto-scaling/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT173",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_monitor_autoscale_setting"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/basic/variables.tf",
+ "/examples/vm-scale-set/linux/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT174",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/boot-diagnostics/variables.tf",
+ "/examples/vm-scale-set/linux/boot-diagnostics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT175",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_storage_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/custom-data/variables.tf",
+ "/examples/vm-scale-set/linux/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT176",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/data-disks/variables.tf",
+ "/examples/vm-scale-set/linux/data-disks/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT177",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/ephemeral-os-disk/variables.tf",
+ "/examples/vm-scale-set/linux/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT178",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/extensions/variables.tf",
+ "/examples/vm-scale-set/linux/extensions/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT179",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/ipv6/variables.tf",
+ "/examples/vm-scale-set/linux/ipv6/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT180",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/multiple-nics/variables.tf",
+ "/examples/vm-scale-set/linux/multiple-nics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT181",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/public-ip-per-instance/variables.tf",
+ "/examples/vm-scale-set/linux/public-ip-per-instance/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT182",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_public_ip_prefix",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/rolling-upgrade-policy/variables.tf",
+ "/examples/vm-scale-set/linux/rolling-upgrade-policy/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT183",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb_nat_pool",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/secrets/variables.tf",
+ "/examples/vm-scale-set/linux/secrets/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT184",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/spot/variables.tf",
+ "/examples/vm-scale-set/linux/spot/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT185",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/ssh-keys/variables.tf",
+ "/examples/vm-scale-set/linux/ssh-keys/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT186",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/system-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/linux/system-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT187",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/user-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/linux/user-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT188",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/zones/variables.tf",
+ "/examples/vm-scale-set/linux/zones/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT189",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/automatic-rolling-updates/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/automatic-rolling-updates/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT190",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_virtual_machine_scale_set",
+ "azurerm_lb_probe"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/autoscale/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/autoscale/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT191",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_monitor_autoscale_setting",
+ "azurerm_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/basic/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT192",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/loadbalancer-probe/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/loadbalancer-probe/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT193",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb_nat_pool",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/auto-scaling/variables.tf",
+ "/examples/vm-scale-set/windows/auto-scaling/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT194",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_monitor_autoscale_setting"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/basic/variables.tf",
+ "/examples/vm-scale-set/windows/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT195",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/boot-diagnostics/variables.tf",
+ "/examples/vm-scale-set/windows/boot-diagnostics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT196",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_storage_account"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/custom-data/variables.tf",
+ "/examples/vm-scale-set/windows/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT197",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/custom-timezone/variables.tf",
+ "/examples/vm-scale-set/windows/custom-timezone/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT198",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/data-disks/variables.tf",
+ "/examples/vm-scale-set/windows/data-disks/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT199",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/ephemeral-os-disk/variables.tf",
+ "/examples/vm-scale-set/windows/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT200",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/extensions/variables.tf",
+ "/examples/vm-scale-set/windows/extensions/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT201",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/hybrid-use-benefit/variables.tf",
+ "/examples/vm-scale-set/windows/hybrid-use-benefit/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT202",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/ipv6/variables.tf",
+ "/examples/vm-scale-set/windows/ipv6/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT203",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/multiple-nics/variables.tf",
+ "/examples/vm-scale-set/windows/multiple-nics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT204",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/public-ip-per-instance/variables.tf",
+ "/examples/vm-scale-set/windows/public-ip-per-instance/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT205",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_public_ip_prefix",
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/rolling-upgrade-policy/variables.tf",
+ "/examples/vm-scale-set/windows/rolling-upgrade-policy/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT206",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb_nat_pool",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/secrets/variables.tf",
+ "/examples/vm-scale-set/windows/secrets/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT207",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT208",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_public_ip"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/2-key-vault.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT209",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/3-service-fabric.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT210",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_service_fabric_cluster"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT211",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/spot/variables.tf",
+ "/examples/vm-scale-set/windows/spot/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT212",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/system-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/windows/system-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT213",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/user-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/windows/user-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT214",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/zones/variables.tf",
+ "/examples/vm-scale-set/windows/zones/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT215",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/web/static-site/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT216",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "github_repository_file",
+ "azurerm_static_site",
+ "github_actions_secret",
+ "azurerm_resource_group"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/apimanagement/testdata/keyvaultcert.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT217",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/attestation/testdata/cert.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT218",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/automation/testdata/automation_certificate_test.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT219",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/batch/testdata/batch_certificate_password.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT220",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/datalake/testdata/application_gateway_test.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT221",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/datashare/testdata/application_gateway_test.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT222",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/firewall/testdata/key.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT223",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/iothub/testdata/batch_certificate.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT224",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/keyvault/testdata/rsa_single.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT225",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/machinelearning/testdata/key.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT226",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/network/testdata/app_service_certificate.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT227",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/web/testdata/app_service_public_certificate.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT228",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ }
+ ],
+ "testUser": "Shahin",
+ "source": "gitConnectorAzureTerraHashicorp"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/master-test.json b/validation/scenario-azure-terraform-hashicorp/master-test.json
new file mode 100644
index 0000000..c4a159f
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/master-test.json
@@ -0,0 +1,8 @@
+{
+ "contentVersion": "1.0.0.0",
+ "notification": [],
+ "masterSnapshot": "master-snapshot",
+ "fileType": "mastertest",
+ "connector": "gitConnectorRemote",
+ "remoteFile": "azure/terraform/master-compliance-test.json"
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT1 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT1
new file mode 100644
index 0000000..26b2d04
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT1
@@ -0,0 +1,155 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/api-management/outputs.tf",
+ "/examples/api-management/variables.tf",
+ "/examples/api-management/main.tf"
+ ],
+ "timestamp": 1642943279555,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/api-management/outputs.tf",
+ "/examples/api-management/variables.tf",
+ "/examples/api-management/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT1",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_api_management_product",
+ "azurerm_api_management_api",
+ "azurerm_resource_group",
+ "azurerm_api_management",
+ "azurerm_api_management_group",
+ "azurerm_api_management_product_api",
+ "azurerm_api_management_product_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT1",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "rg",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.rg"
+ }
+ },
+ {
+ "type": "azurerm_api_management",
+ "name": "apim_service",
+ "properties": {
+ "name": "${var.prefix}-apim-service",
+ "location": "${var.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "publisher_name": "Example Publisher",
+ "publisher_email": "publisher@example.com",
+ "sku_name": "Developer_1",
+ "tags": {
+ "Environment": "Example"
+ },
+ "policy": [
+ {
+ "xml_content": "\n \n \n \n \n "
+ }
+ ],
+ "compiletime_identity": "azurerm_api_management.apim_service"
+ }
+ },
+ {
+ "type": "azurerm_api_management_api",
+ "name": "api",
+ "properties": {
+ "name": "${var.prefix}-api",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "api_management_name": "${azurerm_api_management.apim_service.name}",
+ "revision": 1,
+ "display_name": "${var.prefix}-api",
+ "path": "example",
+ "protocols": [
+ "https",
+ "http"
+ ],
+ "description": "An example API",
+ "import": [
+ {
+ "content_format": "${var.open_api_spec_content_format}",
+ "content_value": "${var.open_api_spec_content_value}"
+ }
+ ],
+ "compiletime_identity": "azurerm_api_management_api.api"
+ }
+ },
+ {
+ "type": "azurerm_api_management_product",
+ "name": "product",
+ "properties": {
+ "product_id": "${var.prefix}-product",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "api_management_name": "${azurerm_api_management.apim_service.name}",
+ "display_name": "${var.prefix}-product",
+ "subscription_required": true,
+ "approval_required": false,
+ "published": true,
+ "description": "An example Product",
+ "compiletime_identity": "azurerm_api_management_product.product"
+ }
+ },
+ {
+ "type": "azurerm_api_management_group",
+ "name": "group",
+ "properties": {
+ "name": "${var.prefix}-group",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "api_management_name": "${azurerm_api_management.apim_service.name}",
+ "display_name": "${var.prefix}-group",
+ "description": "An example group",
+ "compiletime_identity": "azurerm_api_management_group.group"
+ }
+ },
+ {
+ "type": "azurerm_api_management_product_api",
+ "name": "product_api",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "api_management_name": "${azurerm_api_management.apim_service.name}",
+ "product_id": "${azurerm_api_management_product.product.product_id}",
+ "api_name": "${azurerm_api_management_api.api.name}",
+ "compiletime_identity": "azurerm_api_management_product_api.product_api"
+ }
+ },
+ {
+ "type": "azurerm_api_management_product_group",
+ "name": "product_group",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "api_management_name": "${azurerm_api_management.apim_service.name}",
+ "product_id": "${azurerm_api_management_product.product.product_id}",
+ "group_name": "${azurerm_api_management_group.group.name}",
+ "compiletime_identity": "azurerm_api_management_product_group.product_group"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT10 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT10
new file mode 100644
index 0000000..b97f3cb
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT10
@@ -0,0 +1,119 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/linux-authentication/outputs.tf",
+ "/examples/app-service/linux-authentication/variables.tf",
+ "/examples/app-service/linux-authentication/main.tf"
+ ],
+ "timestamp": 1642943279597,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-authentication/outputs.tf",
+ "/examples/app-service/linux-authentication/variables.tf",
+ "/examples/app-service/linux-authentication/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT10",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT10",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "kind": "Linux",
+ "reserved": true,
+ "sku": [
+ {
+ "tier": "Standard",
+ "size": "S1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.main.id}",
+ "site_config": [
+ {
+ "dotnet_framework_version": "v4.0",
+ "remote_debugging_enabled": true,
+ "remote_debugging_version": "VS2019"
+ }
+ ],
+ "auth_settings": [
+ {
+ "enabled": true,
+ "issuer": "https://sts.windows.net/d13958f6-b541-4dad-97b9-5a39c6b01297",
+ "default_provider": "AzureActiveDirectory",
+ "unauthenticated_client_action": "RedirectToLoginPage",
+ "active_directory": [
+ {
+ "client_id": "aadclientid",
+ "client_secret": "aadsecret",
+ "allowed_audiences": [
+ "someallowedaudience"
+ ]
+ }
+ ],
+ "microsoft": [
+ {
+ "client_id": "microsoftclientid",
+ "client_secret": "microsoftclientsecret",
+ "oauth_scopes": [
+ "somescope"
+ ]
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT100 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT100
new file mode 100644
index 0000000..815cc57
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT100
@@ -0,0 +1,51 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/security/securitycenter-setting/main.tf"
+ ],
+ "timestamp": 1642943279921,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/security/securitycenter-setting/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT100",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_security_center_setting"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT100",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_security_center_setting",
+ "name": "example",
+ "properties": {
+ "setting_name": "MCAS",
+ "enabled": true,
+ "compiletime_identity": "azurerm_security_center_setting.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT101 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT101
new file mode 100644
index 0000000..5b8e529
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT101
@@ -0,0 +1,104 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/0-base.tf"
+ ],
+ "timestamp": 1642943279924,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/0-base.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT101",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT101",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "data": {
+ "azurerm_client_config": {
+ "current": {
+ "compiletime_identity": "data.azurerm_client_config.current"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "westeurope",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sf-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-subnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}sfexamplesa",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "GRS",
+ "tags": {
+ "environment": "example"
+ },
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT102 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT102
new file mode 100644
index 0000000..5b4158c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT102
@@ -0,0 +1,134 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/1-keyvault.tf"
+ ],
+ "timestamp": 1642943279928,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/1-keyvault.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT102",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT102",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_key_vault",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}examplekv",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "sku_name": "standard",
+ "enabled_for_deployment": true,
+ "access_policy": [
+ {
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "object_id": "${data.azurerm_client_config.current.object_id}",
+ "certificate_permissions": [
+ "create",
+ "delete",
+ "get",
+ "update",
+ "list"
+ ],
+ "key_permissions": [
+ "create"
+ ],
+ "secret_permissions": [
+ "set"
+ ],
+ "storage_permissions": [
+ "set"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault.example"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}acctestcert",
+ "key_vault_id": "${azurerm_key_vault.example.id}",
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Self"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": true
+ }
+ ],
+ "lifetime_action": [
+ {
+ "action": [
+ {
+ "action_type": "AutoRenew"
+ }
+ ],
+ "trigger": [
+ {
+ "days_before_expiry": 30
+ }
+ ]
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ],
+ "x509_certificate_properties": [
+ {
+ "extended_key_usage": [
+ "1.3.6.1.5.5.7.3.1",
+ "1.3.6.1.5.5.7.3.2"
+ ],
+ "key_usage": [
+ "cRLSign",
+ "dataEncipherment",
+ "digitalSignature",
+ "keyAgreement",
+ "keyCertSign",
+ "keyEncipherment"
+ ],
+ "subject": "CN=${var.prefix}servicefabric.westeurope.cloudapp.azure.com",
+ "validity_in_months": 12
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT103 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT103
new file mode 100644
index 0000000..f98b605
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT103
@@ -0,0 +1,145 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/2-loadbalancer.tf"
+ ],
+ "timestamp": 1642943279932,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/2-loadbalancer.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT103",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_lb_nat_pool",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT103",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}PIPForLB",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Dynamic",
+ "domain_name_label": "exampleservicefabric",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}LoadBalancer",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "PublicIPAddress",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "${var.prefix}BEAPool",
+ "compiletime_identity": "azurerm_lb_backend_address_pool.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_pool",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "${var.prefix}SFApplicationPool",
+ "protocol": "Tcp",
+ "frontend_port_start": 3389,
+ "frontend_port_end": 4500,
+ "backend_port": 3389,
+ "frontend_ip_configuration_name": "${azurerm_lb.example.frontend_ip_configuration[0].name}",
+ "compiletime_identity": "azurerm_lb_nat_pool.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "example_tcp",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "${var.prefix}LBRuleTcp",
+ "protocol": "Tcp",
+ "frontend_port": 19000,
+ "backend_port": 19000,
+ "frontend_ip_configuration_name": "${azurerm_lb.example.frontend_ip_configuration[0].name}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.example.id}",
+ "compiletime_identity": "azurerm_lb_rule.example_tcp"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "example_http",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "${var.prefix}LBRuleHttp",
+ "protocol": "Tcp",
+ "frontend_port": 19080,
+ "backend_port": 19080,
+ "frontend_ip_configuration_name": "${azurerm_lb.example.frontend_ip_configuration[0].name}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.example.id}",
+ "compiletime_identity": "azurerm_lb_rule.example_http"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "example_tcp",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "${var.prefix}SFTcpGatewayProbe",
+ "port": 19000,
+ "compiletime_identity": "azurerm_lb_probe.example_tcp"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "example_http",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "${var.prefix}SFHttpGatewayProbe",
+ "port": 19080,
+ "compiletime_identity": "azurerm_lb_probe.example_http"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT104 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT104
new file mode 100644
index 0000000..8f0e57d
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT104
@@ -0,0 +1,149 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/3-servicefabric.tf"
+ ],
+ "timestamp": 1642943279936,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/service-fabric/windows-vmss-self-signed-certs/variables.tf",
+ "/examples/service-fabric/windows-vmss-self-signed-certs/3-servicefabric.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT104",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_service_fabric_cluster",
+ "azurerm_windows_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT104",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_service_fabric_cluster",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}servicefabric",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "reliability_level": "Bronze",
+ "upgrade_mode": "Automatic",
+ "vm_image": "Windows",
+ "management_endpoint": "https://${var.prefix}servicefabric.westeurope.cloudapp.azure.com:19080",
+ "node_type": [
+ {
+ "name": "Windows",
+ "instance_count": 3,
+ "is_primary": true,
+ "client_endpoint_port": 19000,
+ "http_endpoint_port": 19080
+ }
+ ],
+ "reverse_proxy_certificate": [
+ {
+ "thumbprint": "${azurerm_key_vault_certificate.example.thumbprint}",
+ "x509_store_name": "My"
+ }
+ ],
+ "certificate": [
+ {
+ "thumbprint": "${azurerm_key_vault_certificate.example.thumbprint}",
+ "x509_store_name": "My"
+ }
+ ],
+ "client_certificate_thumbprint": [
+ {
+ "thumbprint": "${azurerm_key_vault_certificate.example.thumbprint}",
+ "is_admin": true
+ }
+ ],
+ "compiletime_identity": "azurerm_service_fabric_cluster.example"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}examplesf",
+ "computer_name_prefix": "${var.prefix}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "sku": "Standard_D1_v2",
+ "instances": "${azurerm_service_fabric_cluster.example.node_type[0].instance_count}",
+ "admin_password": "P@55w0rd1234!",
+ "admin_username": "adminuser",
+ "overprovision": false,
+ "upgrade_mode": "Automatic",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter-with-Containers",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "load_balancer_backend_address_pool_ids": [
+ "${azurerm_lb_backend_address_pool.example.id}"
+ ],
+ "load_balancer_inbound_nat_rules_ids": [
+ "${azurerm_lb_nat_pool.example.id}"
+ ]
+ }
+ ]
+ }
+ ],
+ "secret": [
+ {
+ "certificate": [
+ {
+ "store": "My",
+ "url": "${azurerm_key_vault_certificate.example.secret_id}"
+ }
+ ],
+ "key_vault_id": "${azurerm_key_vault.example.id}"
+ }
+ ],
+ "extension": [
+ {
+ "name": "${var.prefix}ServiceFabricNode",
+ "publisher": "Microsoft.Azure.ServiceFabric",
+ "type": "ServiceFabricNode",
+ "type_handler_version": 1.1,
+ "auto_upgrade_minor_version": false,
+ "settings": "${jsonencode({'clusterEndpoint': '${azurerm_service_fabric_cluster.example.cluster_endpoint}', 'nodeTypeRef': '${azurerm_service_fabric_cluster.example.node_type[0].name}', 'durabilityLevel': 'bronze', 'nicPrefixOverride': '${azurerm_subnet.example.address_prefixes[0]}', 'enableParallelJobs': True, 'certificate': {'commonNames': ['${var.prefix}servicefabric.westeurope.cloudapp.azure.com'], 'x509StoreName': 'My'}})}",
+ "protected_settings": "${jsonencode({'StorageAccountKey1': '${azurerm_storage_account.example.primary_access_key}', 'StorageAccountKey2': '${azurerm_storage_account.example.secondary_access_key}'})}"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT105 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT105
new file mode 100644
index 0000000..2357b4c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT105
@@ -0,0 +1,118 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/servicebus/basic/outputs.tf",
+ "/examples/servicebus/basic/variables.tf",
+ "/examples/servicebus/basic/main.tf"
+ ],
+ "timestamp": 1642943279939,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/servicebus/basic/outputs.tf",
+ "/examples/servicebus/basic/variables.tf",
+ "/examples/servicebus/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT105",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_servicebus_topic",
+ "azurerm_servicebus_queue",
+ "azurerm_resource_group",
+ "azurerm_servicebus_namespace_authorization_rule",
+ "azurerm_servicebus_subscription",
+ "azurerm_servicebus_namespace"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT105",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_namespace",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbnamespace",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "sku": "Standard",
+ "compiletime_identity": "azurerm_servicebus_namespace.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_namespace_authorization_rule",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbnauth",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "send": true,
+ "listen": true,
+ "manage": true,
+ "compiletime_identity": "azurerm_servicebus_namespace_authorization_rule.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_topic",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbtopic",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "enable_partitioning": true,
+ "compiletime_identity": "azurerm_servicebus_topic.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_subscription",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbsubscription",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "topic_name": "${azurerm_servicebus_topic.example.name}",
+ "max_delivery_count": 1,
+ "compiletime_identity": "azurerm_servicebus_subscription.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_queue",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbqueue",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "enable_partitioning": true,
+ "compiletime_identity": "azurerm_servicebus_queue.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT106 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT106
new file mode 100644
index 0000000..086cb4e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT106
@@ -0,0 +1,133 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/servicebus/forwarding/outputs.tf",
+ "/examples/servicebus/forwarding/variables.tf",
+ "/examples/servicebus/forwarding/main.tf"
+ ],
+ "timestamp": 1642943279943,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/servicebus/forwarding/outputs.tf",
+ "/examples/servicebus/forwarding/variables.tf",
+ "/examples/servicebus/forwarding/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT106",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_servicebus_topic_authorization_rule",
+ "azurerm_servicebus_topic",
+ "azurerm_resource_group",
+ "azurerm_servicebus_namespace_authorization_rule",
+ "azurerm_servicebus_subscription",
+ "azurerm_servicebus_namespace"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT106",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_namespace",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbnamespace",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "sku": "Standard",
+ "compiletime_identity": "azurerm_servicebus_namespace.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_namespace_authorization_rule",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbnauth",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "send": true,
+ "listen": true,
+ "manage": true,
+ "compiletime_identity": "azurerm_servicebus_namespace_authorization_rule.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_topic",
+ "name": "source",
+ "properties": {
+ "name": "${var.prefix}-sbt-source",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "enable_partitioning": true,
+ "compiletime_identity": "azurerm_servicebus_topic.source"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_topic",
+ "name": "destination",
+ "properties": {
+ "name": "${var.prefix}-sbt-destination",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "enable_partitioning": true,
+ "compiletime_identity": "azurerm_servicebus_topic.destination"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_topic_authorization_rule",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbtauth-source",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "topic_name": "${azurerm_servicebus_topic.source.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "send": true,
+ "listen": true,
+ "manage": true,
+ "compiletime_identity": "azurerm_servicebus_topic_authorization_rule.example"
+ }
+ },
+ {
+ "type": "azurerm_servicebus_subscription",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sbsubscription",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "namespace_name": "${azurerm_servicebus_namespace.example.name}",
+ "topic_name": "${azurerm_servicebus_topic.source.name}",
+ "forward_to": "${azurerm_servicebus_topic.destination.name}",
+ "max_delivery_count": 1,
+ "compiletime_identity": "azurerm_servicebus_subscription.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT107 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT107
new file mode 100644
index 0000000..8b908f8
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT107
@@ -0,0 +1,98 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/sql-azure/database/outputs.tf",
+ "/examples/sql-azure/database/variables.tf",
+ "/examples/sql-azure/database/main.tf"
+ ],
+ "timestamp": 1642943279947,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/database/outputs.tf",
+ "/examples/sql-azure/database/variables.tf",
+ "/examples/sql-azure/database/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT107",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_sql_server",
+ "azurerm_resource_group",
+ "azurerm_sql_database",
+ "azurerm_sql_firewall_rule"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT107",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_sql_server",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-sqlsvr",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "version": 12.0,
+ "administrator_login": "4dm1n157r470r",
+ "administrator_login_password": "4-v3ry-53cr37-p455w0rd",
+ "compiletime_identity": "azurerm_sql_server.example"
+ }
+ },
+ {
+ "type": "azurerm_sql_database",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-db",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "server_name": "${azurerm_sql_server.example.name}",
+ "edition": "Basic",
+ "collation": "SQL_Latin1_General_CP1_CI_AS",
+ "create_mode": "Default",
+ "requested_service_objective_name": "Basic",
+ "compiletime_identity": "azurerm_sql_database.example"
+ }
+ },
+ {
+ "type": "azurerm_sql_firewall_rule",
+ "name": "example",
+ "properties": {
+ "name": "allow-azure-services",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "server_name": "${azurerm_sql_server.example.name}",
+ "start_ip_address": "0.0.0.0",
+ "end_ip_address": "0.0.0.0",
+ "compiletime_identity": "azurerm_sql_firewall_rule.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT108 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT108
new file mode 100644
index 0000000..f9e1036
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT108
@@ -0,0 +1,132 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/sql-azure/failover_group/variables.tf",
+ "/examples/sql-azure/failover_group/main.tf"
+ ],
+ "timestamp": 1642943279950,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/failover_group/variables.tf",
+ "/examples/sql-azure/failover_group/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT108",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_mssql_server",
+ "azurerm_resource_group",
+ "azurerm_sql_failover_group",
+ "azurerm_mssql_database"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT108",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_server",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-server-primary",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${var.location}",
+ "version": 12.0,
+ "administrator_login": "mradministrator",
+ "administrator_login_password": "thisIsDog11",
+ "compiletime_identity": "azurerm_mssql_server.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_server",
+ "name": "secondary",
+ "properties": {
+ "name": "${var.prefix}-server-secondary",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${var.location_alt}",
+ "version": 12.0,
+ "administrator_login": "mradministrator",
+ "administrator_login_password": "thisIsDog11",
+ "compiletime_identity": "azurerm_mssql_server.secondary"
+ }
+ },
+ {
+ "type": "azurerm_mssql_database",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-db-primary",
+ "server_id": "${azurerm_mssql_server.example.id}",
+ "collation": "SQL_AltDiction_CP850_CI_AI",
+ "license_type": "BasePrice",
+ "sku_name": "GP_Gen5_2",
+ "compiletime_identity": "azurerm_mssql_database.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_database",
+ "name": "secondary",
+ "properties": {
+ "name": "${var.prefix}-db-secondary",
+ "server_id": "${azurerm_mssql_server.secondary.id}",
+ "create_mode": "Secondary",
+ "creation_source_database_id": "${azurerm_mssql_database.example.id}",
+ "compiletime_identity": "azurerm_mssql_database.secondary"
+ }
+ },
+ {
+ "type": "azurerm_sql_failover_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-failover-group",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "server_name": "${azurerm_mssql_server.example.name}",
+ "databases": [
+ "${azurerm_mssql_database.example.id}"
+ ],
+ "partner_servers": [
+ {
+ "id": "${azurerm_mssql_server.secondary.id}"
+ }
+ ],
+ "read_write_endpoint_failover_policy": [
+ {
+ "mode": "Automatic",
+ "grace_minutes": 60
+ }
+ ],
+ "depends_on": [
+ "${azurerm_mssql_database.secondary}"
+ ],
+ "compiletime_identity": "azurerm_sql_failover_group.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT109 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT109
new file mode 100644
index 0000000..b06af87
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT109
@@ -0,0 +1,3066 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/sql-azure/managed_instance_failover_group/main.tf"
+ ],
+ "timestamp": 1642943279954,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/managed_instance_failover_group/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT109",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_sql_managed_instance_failover_group",
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_subnet_network_security_group_association",
+ "azurerm_virtual_network_gateway",
+ "azurerm_sql_managed_instance",
+ "azurerm_route_table",
+ "azurerm_public_ip",
+ "azurerm_virtual_network_gateway_connection",
+ "azurerm_network_security_group",
+ "azurerm_subnet_route_table_association"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT109",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "variable": [
+ {
+ "prefix": {
+ "description": "The prefix which should be used for all resources in this example"
+ }
+ },
+ {
+ "location": {
+ "description": "The Azure Region in which all primary resources in this example should be created."
+ }
+ },
+ {
+ "location_secondary": {
+ "description": "The Azure Region in which all secondary resources in this example should be created."
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_network_security_group",
+ "name": "nsg",
+ "properties": {
+ "name": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "prefix": "${var.prefix}primary",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "nsg",
+ "properties": {
+ "name": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "prefix": "${var.prefix}secondary",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_management_inbound",
+ "properties": {
+ "name": "allow_management_inbound",
+ "priority": 106,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_ranges": [
+ 9000,
+ 9003,
+ 1438,
+ 1440,
+ 1452
+ ],
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_misubnet_inbound",
+ "properties": {
+ "name": "allow_misubnet_inbound",
+ "priority": 200,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "10.0.0.0/24",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_health_probe_inbound",
+ "properties": {
+ "name": "allow_health_probe_inbound",
+ "priority": 300,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "AzureLoadBalancer",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_tds_inbound",
+ "properties": {
+ "name": "allow_tds_inbound",
+ "priority": 1000,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 1433,
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_redirect_inbound",
+ "properties": {
+ "name": "allow_redirect_inbound",
+ "priority": 1100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": "11000-11999",
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_geodr_inbound",
+ "properties": {
+ "name": "allow_geodr_inbound",
+ "priority": 1200,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 5022,
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "deny_all_inbound",
+ "properties": {
+ "name": "deny_all_inbound",
+ "priority": 4096,
+ "direction": "Inbound",
+ "access": "Deny",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_management_outbound",
+ "properties": {
+ "name": "allow_management_outbound",
+ "priority": 102,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_ranges": [
+ 80,
+ 443,
+ 12000
+ ],
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_misubnet_outbound",
+ "properties": {
+ "name": "allow_misubnet_outbound",
+ "priority": 200,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "10.0.0.0/24",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_redirect_outbound",
+ "properties": {
+ "name": "allow_redirect_outbound",
+ "priority": 1100,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": "11000-11999",
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_geodr_outbound",
+ "properties": {
+ "name": "allow_geodr_outbound",
+ "priority": 1200,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 5022,
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "deny_all_outbound",
+ "properties": {
+ "name": "deny_all_outbound",
+ "priority": 4096,
+ "direction": "Outbound",
+ "access": "Deny",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "network_security_group_name": "${var.prefix}primary",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_management_inbound",
+ "properties": {
+ "name": "allow_management_inbound",
+ "priority": 106,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_ranges": [
+ 9000,
+ 9003,
+ 1438,
+ 1440,
+ 1452
+ ],
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_misubnet_inbound",
+ "properties": {
+ "name": "allow_misubnet_inbound",
+ "priority": 200,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "10.1.0.0/24",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_health_probe_inbound",
+ "properties": {
+ "name": "allow_health_probe_inbound",
+ "priority": 300,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "AzureLoadBalancer",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_tds_inbound",
+ "properties": {
+ "name": "allow_tds_inbound",
+ "priority": 1000,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 1433,
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_redirect_inbound",
+ "properties": {
+ "name": "allow_redirect_inbound",
+ "priority": 1100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": "11000-11999",
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_geodr_inbound",
+ "properties": {
+ "name": "allow_geodr_inbound",
+ "priority": 1200,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 5022,
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "deny_all_inbound",
+ "properties": {
+ "name": "deny_all_inbound",
+ "priority": 4096,
+ "direction": "Inbound",
+ "access": "Deny",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_management_outbound",
+ "properties": {
+ "name": "allow_management_outbound",
+ "priority": 102,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_ranges": [
+ 80,
+ 443,
+ 12000
+ ],
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_misubnet_outbound",
+ "properties": {
+ "name": "allow_misubnet_outbound",
+ "priority": 200,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "10.1.0.0/24",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_redirect_outbound",
+ "properties": {
+ "name": "allow_redirect_outbound",
+ "priority": 1100,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": "11000-11999",
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "allow_geodr_outbound",
+ "properties": {
+ "name": "allow_geodr_outbound",
+ "priority": 1200,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 5022,
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "deny_all_outbound",
+ "properties": {
+ "name": "deny_all_outbound",
+ "priority": 4096,
+ "direction": "Outbound",
+ "access": "Deny",
+ "protocol": "*",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "network_security_group_name": "${var.prefix}secondary",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "vnet",
+ "properties": {
+ "name": "${var.prefix}primary",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.primary.location}",
+ "prefix": "${var.prefix}primary",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "vnet",
+ "properties": {
+ "name": "${var.prefix}secondary",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "address_space": [
+ "10.1.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.secondary.location}",
+ "prefix": "${var.prefix}secondary",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet",
+ "properties": {
+ "name": "${var.prefix}primary",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "virtual_network_name": "${var.prefix}primary",
+ "address_prefixes": [
+ "10.0.0.0/24"
+ ],
+ "delegation": [
+ {
+ "name": "managedinstancedelegation",
+ "service_delegation": [
+ {
+ "name": "Microsoft.Sql/managedInstances",
+ "actions": [
+ "Microsoft.Network/virtualNetworks/subnets/join/action",
+ "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action",
+ "Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action"
+ ]
+ }
+ ]
+ }
+ ],
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet",
+ "properties": {
+ "name": "${var.prefix}secondary",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "virtual_network_name": "${var.prefix}secondary",
+ "address_prefixes": [
+ "10.1.0.0/24"
+ ],
+ "delegation": [
+ {
+ "name": "managedinstancedelegation",
+ "service_delegation": [
+ {
+ "name": "Microsoft.Sql/managedInstances",
+ "actions": [
+ "Microsoft.Network/virtualNetworks/subnets/join/action",
+ "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action",
+ "Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action"
+ ]
+ }
+ ]
+ }
+ ],
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "gateway_snet_1",
+ "properties": {
+ "name": "GatewaySubnet",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "virtual_network_name": "${module.primary.vnet_name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "gateway_snet_2",
+ "properties": {
+ "name": "GatewaySubnet",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "virtual_network_name": "${module.secondary.vnet_name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_subnet_network_security_group_association",
+ "name": "subnet_nsg",
+ "properties": {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "network_security_group_id": "${azurerm_network_security_group.nsg.id}",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_subnet_network_security_group_association",
+ "name": "subnet_nsg",
+ "properties": {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "network_security_group_id": "${azurerm_network_security_group.nsg.id}",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_route_table",
+ "name": "rt",
+ "properties": {
+ "name": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "disable_bgp_route_propagation": false,
+ "route": [
+ {
+ "name": "subnet-to-vnetlocal",
+ "address_prefix": "10.0.0.0/24",
+ "next_hop_type": "VnetLocal"
+ },
+ {
+ "name": "mi-13-64-11-nexthop-internet",
+ "address_prefix": "13.64.0.0/11",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-13-104-14-nexthop-internet",
+ "address_prefix": "13.104.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-34-15-nexthop-internet",
+ "address_prefix": "20.34.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-36-14-nexthop-internet",
+ "address_prefix": "20.36.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-40-13-nexthop-internet",
+ "address_prefix": "20.40.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-128-16-nexthop-internet",
+ "address_prefix": "20.128.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-140-15-nexthop-internet",
+ "address_prefix": "20.140.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-144-14-nexthop-internet",
+ "address_prefix": "20.144.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-150-15-nexthop-internet",
+ "address_prefix": "20.150.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-160-12-nexthop-internet",
+ "address_prefix": "20.160.0.0/12",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-176-14-nexthop-internet",
+ "address_prefix": "20.176.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-180-14-nexthop-internet",
+ "address_prefix": "20.180.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-184-13-nexthop-internet",
+ "address_prefix": "20.184.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-40-64-10-nexthop-internet",
+ "address_prefix": "40.64.0.0/10",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-4-15-nexthop-internet",
+ "address_prefix": "51.4.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-8-16-nexthop-internet",
+ "address_prefix": "51.8.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-10-15-nexthop-internet",
+ "address_prefix": "51.10.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-12-15-nexthop-internet",
+ "address_prefix": "51.12.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-18-16-nexthop-internet",
+ "address_prefix": "51.18.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-51-16-nexthop-internet",
+ "address_prefix": "51.51.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-53-16-nexthop-internet",
+ "address_prefix": "51.53.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-103-16-nexthop-internet",
+ "address_prefix": "51.103.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-104-15-nexthop-internet",
+ "address_prefix": "51.104.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-107-16-nexthop-internet",
+ "address_prefix": "51.107.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-116-16-nexthop-internet",
+ "address_prefix": "51.116.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-120-16-nexthop-internet",
+ "address_prefix": "51.120.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-124-16-nexthop-internet",
+ "address_prefix": "51.124.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-132-16-nexthop-internet",
+ "address_prefix": "51.132.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-136-15-nexthop-internet",
+ "address_prefix": "51.136.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-138-16-nexthop-internet",
+ "address_prefix": "51.138.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-140-14-nexthop-internet",
+ "address_prefix": "51.140.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-144-15-nexthop-internet",
+ "address_prefix": "51.144.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-96-12-nexthop-internet",
+ "address_prefix": "52.96.0.0/12",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-112-14-nexthop-internet",
+ "address_prefix": "52.112.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-125-16-nexthop-internet",
+ "address_prefix": "52.125.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-126-15-nexthop-internet",
+ "address_prefix": "52.126.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-130-15-nexthop-internet",
+ "address_prefix": "52.130.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-132-14-nexthop-internet",
+ "address_prefix": "52.132.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-136-13-nexthop-internet",
+ "address_prefix": "52.136.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-145-16-nexthop-internet",
+ "address_prefix": "52.145.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-146-15-nexthop-internet",
+ "address_prefix": "52.146.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-148-14-nexthop-internet",
+ "address_prefix": "52.148.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-152-13-nexthop-internet",
+ "address_prefix": "52.152.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-160-11-nexthop-internet",
+ "address_prefix": "52.160.0.0/11",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-224-11-nexthop-internet",
+ "address_prefix": "52.224.0.0/11",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-64-4-18-nexthop-internet",
+ "address_prefix": "64.4.0.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-65-52-14-nexthop-internet",
+ "address_prefix": "65.52.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-66-119-144-20-nexthop-internet",
+ "address_prefix": "66.119.144.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-70-37-17-nexthop-internet",
+ "address_prefix": "70.37.0.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-70-37-128-18-nexthop-internet",
+ "address_prefix": "70.37.128.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-91-190-216-21-nexthop-internet",
+ "address_prefix": "91.190.216.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-94-245-64-18-nexthop-internet",
+ "address_prefix": "94.245.64.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-9-8-22-nexthop-internet",
+ "address_prefix": "103.9.8.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-25-156-24-nexthop-internet",
+ "address_prefix": "103.25.156.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-25-157-24-nexthop-internet",
+ "address_prefix": "103.25.157.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-25-158-23-nexthop-internet",
+ "address_prefix": "103.25.158.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-36-96-22-nexthop-internet",
+ "address_prefix": "103.36.96.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-255-140-22-nexthop-internet",
+ "address_prefix": "103.255.140.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-104-40-13-nexthop-internet",
+ "address_prefix": "104.40.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-104-146-15-nexthop-internet",
+ "address_prefix": "104.146.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-104-208-13-nexthop-internet",
+ "address_prefix": "104.208.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-111-221-16-20-nexthop-internet",
+ "address_prefix": "111.221.16.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-111-221-64-18-nexthop-internet",
+ "address_prefix": "111.221.64.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-129-75-16-nexthop-internet",
+ "address_prefix": "129.75.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-1-24-nexthop-internet",
+ "address_prefix": "131.253.1.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-3-24-nexthop-internet",
+ "address_prefix": "131.253.3.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-5-24-nexthop-internet",
+ "address_prefix": "131.253.5.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-6-24-nexthop-internet",
+ "address_prefix": "131.253.6.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-8-24-nexthop-internet",
+ "address_prefix": "131.253.8.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-12-22-nexthop-internet",
+ "address_prefix": "131.253.12.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-16-23-nexthop-internet",
+ "address_prefix": "131.253.16.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-18-24-nexthop-internet",
+ "address_prefix": "131.253.18.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-21-24-nexthop-internet",
+ "address_prefix": "131.253.21.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-22-23-nexthop-internet",
+ "address_prefix": "131.253.22.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-24-21-nexthop-internet",
+ "address_prefix": "131.253.24.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-32-20-nexthop-internet",
+ "address_prefix": "131.253.32.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-61-24-nexthop-internet",
+ "address_prefix": "131.253.61.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-62-23-nexthop-internet",
+ "address_prefix": "131.253.62.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-64-18-nexthop-internet",
+ "address_prefix": "131.253.64.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-128-17-nexthop-internet",
+ "address_prefix": "131.253.128.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-132-245-16-nexthop-internet",
+ "address_prefix": "132.245.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-134-170-16-nexthop-internet",
+ "address_prefix": "134.170.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-134-177-16-nexthop-internet",
+ "address_prefix": "134.177.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-137-116-15-nexthop-internet",
+ "address_prefix": "137.116.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-137-135-16-nexthop-internet",
+ "address_prefix": "137.135.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-138-91-16-nexthop-internet",
+ "address_prefix": "138.91.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-138-196-16-nexthop-internet",
+ "address_prefix": "138.196.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-139-217-16-nexthop-internet",
+ "address_prefix": "139.217.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-139-219-16-nexthop-internet",
+ "address_prefix": "139.219.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-141-251-16-nexthop-internet",
+ "address_prefix": "141.251.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-146-147-16-nexthop-internet",
+ "address_prefix": "146.147.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-147-243-16-nexthop-internet",
+ "address_prefix": "147.243.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-150-171-16-nexthop-internet",
+ "address_prefix": "150.171.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-150-242-48-22-nexthop-internet",
+ "address_prefix": "150.242.48.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-157-54-15-nexthop-internet",
+ "address_prefix": "157.54.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-157-56-14-nexthop-internet",
+ "address_prefix": "157.56.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-157-60-16-nexthop-internet",
+ "address_prefix": "157.60.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-167-220-16-nexthop-internet",
+ "address_prefix": "167.220.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-168-61-16-nexthop-internet",
+ "address_prefix": "168.61.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-168-62-15-nexthop-internet",
+ "address_prefix": "168.62.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-191-232-13-nexthop-internet",
+ "address_prefix": "191.232.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-32-16-nexthop-internet",
+ "address_prefix": "192.32.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-48-225-24-nexthop-internet",
+ "address_prefix": "192.48.225.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-84-159-24-nexthop-internet",
+ "address_prefix": "192.84.159.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-84-160-23-nexthop-internet",
+ "address_prefix": "192.84.160.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-100-102-24-nexthop-internet",
+ "address_prefix": "192.100.102.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-100-103-24-nexthop-internet",
+ "address_prefix": "192.100.103.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-197-157-24-nexthop-internet",
+ "address_prefix": "192.197.157.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-193-149-64-19-nexthop-internet",
+ "address_prefix": "193.149.64.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-193-221-113-24-nexthop-internet",
+ "address_prefix": "193.221.113.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-194-69-96-19-nexthop-internet",
+ "address_prefix": "194.69.96.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-194-110-197-24-nexthop-internet",
+ "address_prefix": "194.110.197.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-198-105-232-22-nexthop-internet",
+ "address_prefix": "198.105.232.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-198-200-130-24-nexthop-internet",
+ "address_prefix": "198.200.130.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-198-206-164-24-nexthop-internet",
+ "address_prefix": "198.206.164.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-60-28-24-nexthop-internet",
+ "address_prefix": "199.60.28.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-74-210-24-nexthop-internet",
+ "address_prefix": "199.74.210.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-103-90-23-nexthop-internet",
+ "address_prefix": "199.103.90.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-103-122-24-nexthop-internet",
+ "address_prefix": "199.103.122.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-242-32-20-nexthop-internet",
+ "address_prefix": "199.242.32.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-242-48-21-nexthop-internet",
+ "address_prefix": "199.242.48.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-202-89-224-20-nexthop-internet",
+ "address_prefix": "202.89.224.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-13-120-21-nexthop-internet",
+ "address_prefix": "204.13.120.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-14-180-22-nexthop-internet",
+ "address_prefix": "204.14.180.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-135-24-nexthop-internet",
+ "address_prefix": "204.79.135.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-179-24-nexthop-internet",
+ "address_prefix": "204.79.179.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-181-24-nexthop-internet",
+ "address_prefix": "204.79.181.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-188-24-nexthop-internet",
+ "address_prefix": "204.79.188.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-195-24-nexthop-internet",
+ "address_prefix": "204.79.195.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-196-23-nexthop-internet",
+ "address_prefix": "204.79.196.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-252-24-nexthop-internet",
+ "address_prefix": "204.79.252.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-152-18-23-nexthop-internet",
+ "address_prefix": "204.152.18.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-152-140-23-nexthop-internet",
+ "address_prefix": "204.152.140.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-192-24-nexthop-internet",
+ "address_prefix": "204.231.192.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-194-23-nexthop-internet",
+ "address_prefix": "204.231.194.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-197-24-nexthop-internet",
+ "address_prefix": "204.231.197.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-198-23-nexthop-internet",
+ "address_prefix": "204.231.198.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-200-21-nexthop-internet",
+ "address_prefix": "204.231.200.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-208-20-nexthop-internet",
+ "address_prefix": "204.231.208.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-236-24-nexthop-internet",
+ "address_prefix": "204.231.236.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-205-174-224-20-nexthop-internet",
+ "address_prefix": "205.174.224.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-206-138-168-21-nexthop-internet",
+ "address_prefix": "206.138.168.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-206-191-224-19-nexthop-internet",
+ "address_prefix": "206.191.224.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-207-46-16-nexthop-internet",
+ "address_prefix": "207.46.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-207-68-128-18-nexthop-internet",
+ "address_prefix": "207.68.128.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-208-68-136-21-nexthop-internet",
+ "address_prefix": "208.68.136.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-208-76-44-22-nexthop-internet",
+ "address_prefix": "208.76.44.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-208-84-21-nexthop-internet",
+ "address_prefix": "208.84.0.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-209-240-192-19-nexthop-internet",
+ "address_prefix": "209.240.192.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-213-199-128-18-nexthop-internet",
+ "address_prefix": "213.199.128.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-216-32-180-22-nexthop-internet",
+ "address_prefix": "216.32.180.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-216-220-208-20-nexthop-internet",
+ "address_prefix": "216.220.208.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-33-16-nexthop-internet",
+ "address_prefix": "20.33.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-48-12-nexthop-internet",
+ "address_prefix": "20.48.0.0/12",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-64-10-nexthop-internet",
+ "address_prefix": "20.64.0.0/10",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-135-16-nexthop-internet",
+ "address_prefix": "20.135.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-136-16-nexthop-internet",
+ "address_prefix": "20.136.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-143-16-nexthop-internet",
+ "address_prefix": "20.143.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-192-10-nexthop-internet",
+ "address_prefix": "20.192.0.0/10",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-167-105-16-nexthop-internet",
+ "address_prefix": "131.107.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-131-107-16-nexthop-internet",
+ "address_prefix": "167.105.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-23-96-13-nexthop-internet",
+ "address_prefix": "23.96.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-42-159-16-nexthop-internet",
+ "address_prefix": "42.159.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-51-13-17-nexthop-internet",
+ "address_prefix": "51.13.0.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-51-120-128-17-nexthop-internet",
+ "address_prefix": "51.120.128.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-102-37-18-nexthop-internet",
+ "address_prefix": "102.37.0.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-102-133-16-nexthop-internet",
+ "address_prefix": "102.133.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-199-30-16-20-nexthop-internet",
+ "address_prefix": "199.30.16.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-204-79-180-24-nexthop-internet",
+ "address_prefix": "204.79.180.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage",
+ "address_prefix": "Storage",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-SqlManagement",
+ "address_prefix": "SqlManagement",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureMonitor",
+ "address_prefix": "AzureMonitor",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-CorpNetSaw",
+ "address_prefix": "CorpNetSaw",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-CorpNetPublic",
+ "address_prefix": "CorpNetPublic",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureActiveDirectory",
+ "address_prefix": "AzureActiveDirectory",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.westeurope",
+ "address_prefix": "AzureCloud.westeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.northeurope",
+ "address_prefix": "AzureCloud.northeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.westeurope",
+ "address_prefix": "Storage.westeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.northeurope",
+ "address_prefix": "Storage.northeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.westeurope",
+ "address_prefix": "EventHub.westeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.northeurope",
+ "address_prefix": "EventHub.northeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "AzureCloud.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "AzureCloud.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.westus2",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Storage.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Storage.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.westus2",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "EventHub.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "EventHub.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.westus2",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Sql.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Sql.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Sql.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Sql.westus2",
+ "next_hop_type": "Internet"
+ }
+ ],
+ "depends_on": [
+ {
+ "name": "${var.prefix}primary",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "virtual_network_name": "${var.prefix}primary",
+ "address_prefixes": [
+ "10.0.0.0/24"
+ ],
+ "delegation": [
+ {
+ "name": "managedinstancedelegation",
+ "service_delegation": [
+ {
+ "name": "Microsoft.Sql/managedInstances",
+ "actions": [
+ "Microsoft.Network/virtualNetworks/subnets/join/action",
+ "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action",
+ "Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "prefix": "${var.prefix}primary",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_route_table",
+ "name": "rt",
+ "properties": {
+ "name": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "disable_bgp_route_propagation": false,
+ "route": [
+ {
+ "name": "subnet-to-vnetlocal",
+ "address_prefix": "10.1.0.0/24",
+ "next_hop_type": "VnetLocal"
+ },
+ {
+ "name": "mi-13-64-11-nexthop-internet",
+ "address_prefix": "13.64.0.0/11",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-13-104-14-nexthop-internet",
+ "address_prefix": "13.104.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-34-15-nexthop-internet",
+ "address_prefix": "20.34.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-36-14-nexthop-internet",
+ "address_prefix": "20.36.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-40-13-nexthop-internet",
+ "address_prefix": "20.40.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-128-16-nexthop-internet",
+ "address_prefix": "20.128.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-140-15-nexthop-internet",
+ "address_prefix": "20.140.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-144-14-nexthop-internet",
+ "address_prefix": "20.144.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-150-15-nexthop-internet",
+ "address_prefix": "20.150.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-160-12-nexthop-internet",
+ "address_prefix": "20.160.0.0/12",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-176-14-nexthop-internet",
+ "address_prefix": "20.176.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-180-14-nexthop-internet",
+ "address_prefix": "20.180.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-20-184-13-nexthop-internet",
+ "address_prefix": "20.184.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-40-64-10-nexthop-internet",
+ "address_prefix": "40.64.0.0/10",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-4-15-nexthop-internet",
+ "address_prefix": "51.4.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-8-16-nexthop-internet",
+ "address_prefix": "51.8.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-10-15-nexthop-internet",
+ "address_prefix": "51.10.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-12-15-nexthop-internet",
+ "address_prefix": "51.12.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-18-16-nexthop-internet",
+ "address_prefix": "51.18.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-51-16-nexthop-internet",
+ "address_prefix": "51.51.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-53-16-nexthop-internet",
+ "address_prefix": "51.53.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-103-16-nexthop-internet",
+ "address_prefix": "51.103.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-104-15-nexthop-internet",
+ "address_prefix": "51.104.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-107-16-nexthop-internet",
+ "address_prefix": "51.107.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-116-16-nexthop-internet",
+ "address_prefix": "51.116.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-120-16-nexthop-internet",
+ "address_prefix": "51.120.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-124-16-nexthop-internet",
+ "address_prefix": "51.124.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-132-16-nexthop-internet",
+ "address_prefix": "51.132.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-136-15-nexthop-internet",
+ "address_prefix": "51.136.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-138-16-nexthop-internet",
+ "address_prefix": "51.138.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-140-14-nexthop-internet",
+ "address_prefix": "51.140.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-51-144-15-nexthop-internet",
+ "address_prefix": "51.144.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-96-12-nexthop-internet",
+ "address_prefix": "52.96.0.0/12",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-112-14-nexthop-internet",
+ "address_prefix": "52.112.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-125-16-nexthop-internet",
+ "address_prefix": "52.125.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-126-15-nexthop-internet",
+ "address_prefix": "52.126.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-130-15-nexthop-internet",
+ "address_prefix": "52.130.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-132-14-nexthop-internet",
+ "address_prefix": "52.132.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-136-13-nexthop-internet",
+ "address_prefix": "52.136.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-145-16-nexthop-internet",
+ "address_prefix": "52.145.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-146-15-nexthop-internet",
+ "address_prefix": "52.146.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-148-14-nexthop-internet",
+ "address_prefix": "52.148.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-152-13-nexthop-internet",
+ "address_prefix": "52.152.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-160-11-nexthop-internet",
+ "address_prefix": "52.160.0.0/11",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-52-224-11-nexthop-internet",
+ "address_prefix": "52.224.0.0/11",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-64-4-18-nexthop-internet",
+ "address_prefix": "64.4.0.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-65-52-14-nexthop-internet",
+ "address_prefix": "65.52.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-66-119-144-20-nexthop-internet",
+ "address_prefix": "66.119.144.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-70-37-17-nexthop-internet",
+ "address_prefix": "70.37.0.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-70-37-128-18-nexthop-internet",
+ "address_prefix": "70.37.128.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-91-190-216-21-nexthop-internet",
+ "address_prefix": "91.190.216.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-94-245-64-18-nexthop-internet",
+ "address_prefix": "94.245.64.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-9-8-22-nexthop-internet",
+ "address_prefix": "103.9.8.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-25-156-24-nexthop-internet",
+ "address_prefix": "103.25.156.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-25-157-24-nexthop-internet",
+ "address_prefix": "103.25.157.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-25-158-23-nexthop-internet",
+ "address_prefix": "103.25.158.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-36-96-22-nexthop-internet",
+ "address_prefix": "103.36.96.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-103-255-140-22-nexthop-internet",
+ "address_prefix": "103.255.140.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-104-40-13-nexthop-internet",
+ "address_prefix": "104.40.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-104-146-15-nexthop-internet",
+ "address_prefix": "104.146.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-104-208-13-nexthop-internet",
+ "address_prefix": "104.208.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-111-221-16-20-nexthop-internet",
+ "address_prefix": "111.221.16.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-111-221-64-18-nexthop-internet",
+ "address_prefix": "111.221.64.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-129-75-16-nexthop-internet",
+ "address_prefix": "129.75.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-1-24-nexthop-internet",
+ "address_prefix": "131.253.1.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-3-24-nexthop-internet",
+ "address_prefix": "131.253.3.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-5-24-nexthop-internet",
+ "address_prefix": "131.253.5.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-6-24-nexthop-internet",
+ "address_prefix": "131.253.6.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-8-24-nexthop-internet",
+ "address_prefix": "131.253.8.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-12-22-nexthop-internet",
+ "address_prefix": "131.253.12.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-16-23-nexthop-internet",
+ "address_prefix": "131.253.16.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-18-24-nexthop-internet",
+ "address_prefix": "131.253.18.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-21-24-nexthop-internet",
+ "address_prefix": "131.253.21.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-22-23-nexthop-internet",
+ "address_prefix": "131.253.22.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-24-21-nexthop-internet",
+ "address_prefix": "131.253.24.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-32-20-nexthop-internet",
+ "address_prefix": "131.253.32.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-61-24-nexthop-internet",
+ "address_prefix": "131.253.61.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-62-23-nexthop-internet",
+ "address_prefix": "131.253.62.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-64-18-nexthop-internet",
+ "address_prefix": "131.253.64.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-131-253-128-17-nexthop-internet",
+ "address_prefix": "131.253.128.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-132-245-16-nexthop-internet",
+ "address_prefix": "132.245.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-134-170-16-nexthop-internet",
+ "address_prefix": "134.170.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-134-177-16-nexthop-internet",
+ "address_prefix": "134.177.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-137-116-15-nexthop-internet",
+ "address_prefix": "137.116.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-137-135-16-nexthop-internet",
+ "address_prefix": "137.135.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-138-91-16-nexthop-internet",
+ "address_prefix": "138.91.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-138-196-16-nexthop-internet",
+ "address_prefix": "138.196.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-139-217-16-nexthop-internet",
+ "address_prefix": "139.217.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-139-219-16-nexthop-internet",
+ "address_prefix": "139.219.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-141-251-16-nexthop-internet",
+ "address_prefix": "141.251.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-146-147-16-nexthop-internet",
+ "address_prefix": "146.147.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-147-243-16-nexthop-internet",
+ "address_prefix": "147.243.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-150-171-16-nexthop-internet",
+ "address_prefix": "150.171.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-150-242-48-22-nexthop-internet",
+ "address_prefix": "150.242.48.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-157-54-15-nexthop-internet",
+ "address_prefix": "157.54.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-157-56-14-nexthop-internet",
+ "address_prefix": "157.56.0.0/14",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-157-60-16-nexthop-internet",
+ "address_prefix": "157.60.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-167-220-16-nexthop-internet",
+ "address_prefix": "167.220.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-168-61-16-nexthop-internet",
+ "address_prefix": "168.61.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-168-62-15-nexthop-internet",
+ "address_prefix": "168.62.0.0/15",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-191-232-13-nexthop-internet",
+ "address_prefix": "191.232.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-32-16-nexthop-internet",
+ "address_prefix": "192.32.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-48-225-24-nexthop-internet",
+ "address_prefix": "192.48.225.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-84-159-24-nexthop-internet",
+ "address_prefix": "192.84.159.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-84-160-23-nexthop-internet",
+ "address_prefix": "192.84.160.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-100-102-24-nexthop-internet",
+ "address_prefix": "192.100.102.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-100-103-24-nexthop-internet",
+ "address_prefix": "192.100.103.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-192-197-157-24-nexthop-internet",
+ "address_prefix": "192.197.157.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-193-149-64-19-nexthop-internet",
+ "address_prefix": "193.149.64.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-193-221-113-24-nexthop-internet",
+ "address_prefix": "193.221.113.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-194-69-96-19-nexthop-internet",
+ "address_prefix": "194.69.96.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-194-110-197-24-nexthop-internet",
+ "address_prefix": "194.110.197.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-198-105-232-22-nexthop-internet",
+ "address_prefix": "198.105.232.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-198-200-130-24-nexthop-internet",
+ "address_prefix": "198.200.130.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-198-206-164-24-nexthop-internet",
+ "address_prefix": "198.206.164.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-60-28-24-nexthop-internet",
+ "address_prefix": "199.60.28.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-74-210-24-nexthop-internet",
+ "address_prefix": "199.74.210.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-103-90-23-nexthop-internet",
+ "address_prefix": "199.103.90.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-103-122-24-nexthop-internet",
+ "address_prefix": "199.103.122.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-242-32-20-nexthop-internet",
+ "address_prefix": "199.242.32.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-199-242-48-21-nexthop-internet",
+ "address_prefix": "199.242.48.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-202-89-224-20-nexthop-internet",
+ "address_prefix": "202.89.224.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-13-120-21-nexthop-internet",
+ "address_prefix": "204.13.120.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-14-180-22-nexthop-internet",
+ "address_prefix": "204.14.180.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-135-24-nexthop-internet",
+ "address_prefix": "204.79.135.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-179-24-nexthop-internet",
+ "address_prefix": "204.79.179.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-181-24-nexthop-internet",
+ "address_prefix": "204.79.181.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-188-24-nexthop-internet",
+ "address_prefix": "204.79.188.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-195-24-nexthop-internet",
+ "address_prefix": "204.79.195.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-196-23-nexthop-internet",
+ "address_prefix": "204.79.196.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-79-252-24-nexthop-internet",
+ "address_prefix": "204.79.252.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-152-18-23-nexthop-internet",
+ "address_prefix": "204.152.18.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-152-140-23-nexthop-internet",
+ "address_prefix": "204.152.140.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-192-24-nexthop-internet",
+ "address_prefix": "204.231.192.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-194-23-nexthop-internet",
+ "address_prefix": "204.231.194.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-197-24-nexthop-internet",
+ "address_prefix": "204.231.197.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-198-23-nexthop-internet",
+ "address_prefix": "204.231.198.0/23",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-200-21-nexthop-internet",
+ "address_prefix": "204.231.200.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-208-20-nexthop-internet",
+ "address_prefix": "204.231.208.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-204-231-236-24-nexthop-internet",
+ "address_prefix": "204.231.236.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-205-174-224-20-nexthop-internet",
+ "address_prefix": "205.174.224.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-206-138-168-21-nexthop-internet",
+ "address_prefix": "206.138.168.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-206-191-224-19-nexthop-internet",
+ "address_prefix": "206.191.224.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-207-46-16-nexthop-internet",
+ "address_prefix": "207.46.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-207-68-128-18-nexthop-internet",
+ "address_prefix": "207.68.128.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-208-68-136-21-nexthop-internet",
+ "address_prefix": "208.68.136.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-208-76-44-22-nexthop-internet",
+ "address_prefix": "208.76.44.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-208-84-21-nexthop-internet",
+ "address_prefix": "208.84.0.0/21",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-209-240-192-19-nexthop-internet",
+ "address_prefix": "209.240.192.0/19",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-213-199-128-18-nexthop-internet",
+ "address_prefix": "213.199.128.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-216-32-180-22-nexthop-internet",
+ "address_prefix": "216.32.180.0/22",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "mi-216-220-208-20-nexthop-internet",
+ "address_prefix": "216.220.208.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-33-16-nexthop-internet",
+ "address_prefix": "20.33.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-48-12-nexthop-internet",
+ "address_prefix": "20.48.0.0/12",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-64-10-nexthop-internet",
+ "address_prefix": "20.64.0.0/10",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-135-16-nexthop-internet",
+ "address_prefix": "20.135.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-136-16-nexthop-internet",
+ "address_prefix": "20.136.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-143-16-nexthop-internet",
+ "address_prefix": "20.143.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-20-192-10-nexthop-internet",
+ "address_prefix": "20.192.0.0/10",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-167-105-16-nexthop-internet",
+ "address_prefix": "131.107.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-131-107-16-nexthop-internet",
+ "address_prefix": "167.105.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-23-96-13-nexthop-internet",
+ "address_prefix": "23.96.0.0/13",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-42-159-16-nexthop-internet",
+ "address_prefix": "42.159.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-51-13-17-nexthop-internet",
+ "address_prefix": "51.13.0.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-51-120-128-17-nexthop-internet",
+ "address_prefix": "51.120.128.0/17",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-102-37-18-nexthop-internet",
+ "address_prefix": "102.37.0.0/18",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-102-133-16-nexthop-internet",
+ "address_prefix": "102.133.0.0/16",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-199-30-16-20-nexthop-internet",
+ "address_prefix": "199.30.16.0/20",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-204-79-180-24-nexthop-internet",
+ "address_prefix": "204.79.180.0/24",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage",
+ "address_prefix": "Storage",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-SqlManagement",
+ "address_prefix": "SqlManagement",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureMonitor",
+ "address_prefix": "AzureMonitor",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-CorpNetSaw",
+ "address_prefix": "CorpNetSaw",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-CorpNetPublic",
+ "address_prefix": "CorpNetPublic",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureActiveDirectory",
+ "address_prefix": "AzureActiveDirectory",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.westeurope",
+ "address_prefix": "AzureCloud.westeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.northeurope",
+ "address_prefix": "AzureCloud.northeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.westeurope",
+ "address_prefix": "Storage.westeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.northeurope",
+ "address_prefix": "Storage.northeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.westeurope",
+ "address_prefix": "EventHub.westeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.northeurope",
+ "address_prefix": "EventHub.northeurope",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "AzureCloud.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "AzureCloud.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-AzureCloud.westus2",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Storage.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Storage.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Storage.westus2",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "EventHub.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "EventHub.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-EventHub.westus2",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Sql.westcentralus",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Sql.westcentralus",
+ "next_hop_type": "Internet"
+ },
+ {
+ "address_prefix": "Sql.westus2",
+ "name": "Microsoft.Sql-managedInstances_UseOnly_mi-Sql.westus2",
+ "next_hop_type": "Internet"
+ }
+ ],
+ "depends_on": [
+ {
+ "name": "${var.prefix}secondary",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "virtual_network_name": "${var.prefix}secondary",
+ "address_prefixes": [
+ "10.1.0.0/24"
+ ],
+ "delegation": [
+ {
+ "name": "managedinstancedelegation",
+ "service_delegation": [
+ {
+ "name": "Microsoft.Sql/managedInstances",
+ "actions": [
+ "Microsoft.Network/virtualNetworks/subnets/join/action",
+ "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action",
+ "Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "prefix": "${var.prefix}secondary",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_subnet_route_table_association",
+ "name": "subnet_rt",
+ "properties": {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "route_table_id": "${azurerm_route_table.rt.id}",
+ "prefix": "${var.prefix}primary",
+ "location": "${azurerm_resource_group.primary.location}",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_subnet_route_table_association",
+ "name": "subnet_rt",
+ "properties": {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "route_table_id": "${azurerm_route_table.rt.id}",
+ "prefix": "${var.prefix}secondary",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "dns_zone_partner_id": "${module.primary.managed_instance_id}",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_sql_managed_instance",
+ "name": "mi",
+ "properties": {
+ "name": "${var.prefix}primary",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "location": "${azurerm_resource_group.primary.location}",
+ "administrator_login": "mradministrator",
+ "administrator_login_password": "thisIsDog11",
+ "license_type": "BasePrice",
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "sku_name": "GP_Gen5",
+ "vcores": 4,
+ "storage_size_in_gb": 32,
+ "dns_zone_partner_id": null,
+ "depends_on": [
+ {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "network_security_group_id": "${azurerm_network_security_group.nsg.id}"
+ },
+ {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "route_table_id": "${azurerm_route_table.rt.id}"
+ }
+ ],
+ "prefix": "${var.prefix}primary",
+ "compiletime_identity": "module.primary"
+ }
+ },
+ {
+ "type": "azurerm_sql_managed_instance",
+ "name": "mi",
+ "properties": {
+ "name": "${var.prefix}secondary",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "administrator_login": "mradministrator",
+ "administrator_login_password": "thisIsDog11",
+ "license_type": "BasePrice",
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "sku_name": "GP_Gen5",
+ "vcores": 4,
+ "storage_size_in_gb": 32,
+ "dns_zone_partner_id": "var.dns_zone_partner_id != \"\" ? var.dns_zone_partner_id : None",
+ "depends_on": [
+ {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "network_security_group_id": "${azurerm_network_security_group.nsg.id}"
+ },
+ {
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "route_table_id": "${azurerm_route_table.rt.id}"
+ }
+ ],
+ "prefix": "${var.prefix}secondary",
+ "vnet_range": "10.1.0.0/16",
+ "subnet_range": "10.1.0.0/24",
+ "compiletime_identity": "module.secondary"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "pip_1",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.primary.location}",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "allocation_method": "Dynamic",
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "pip_2",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "allocation_method": "Dynamic",
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_gateway",
+ "name": "vnet_gw_1",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.primary.location}",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "type": "Vpn",
+ "vpn_type": "RouteBased",
+ "sku": "Basic",
+ "ip_configuration": [
+ {
+ "name": "vnetGatewayConfig",
+ "public_ip_address_id": "${azurerm_public_ip.pip_1.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "subnet_id": "${azurerm_subnet.gateway_snet_1.id}"
+ }
+ ],
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_gateway",
+ "name": "vnet_gw_2",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "type": "Vpn",
+ "vpn_type": "RouteBased",
+ "sku": "Basic",
+ "ip_configuration": [
+ {
+ "name": "vnetGatewayConfig",
+ "public_ip_address_id": "${azurerm_public_ip.pip_2.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "subnet_id": "${azurerm_subnet.gateway_snet_2.id}"
+ }
+ ],
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_gateway_connection",
+ "name": "gw_connection_1",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.primary.location}",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "type": "Vnet2Vnet",
+ "virtual_network_gateway_id": "${azurerm_virtual_network_gateway.vnet_gw_1.id}",
+ "peer_virtual_network_gateway_id": "${azurerm_virtual_network_gateway.vnet_gw_2.id}",
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_gateway_connection",
+ "name": "gw_connection_2",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name": "${azurerm_resource_group.secondary.name}",
+ "type": "Vnet2Vnet",
+ "virtual_network_gateway_id": "${azurerm_virtual_network_gateway.vnet_gw_2.id}",
+ "peer_virtual_network_gateway_id": "${azurerm_virtual_network_gateway.vnet_gw_1.id}",
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24",
+ "compiletime_identity": "module.vnet_gateway"
+ }
+ },
+ {
+ "type": "azurerm_resource_group",
+ "name": "primary",
+ "properties": {
+ "name": "${var.prefix}-primary-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.primary"
+ }
+ },
+ {
+ "type": "azurerm_resource_group",
+ "name": "secondary",
+ "properties": {
+ "name": "${var.prefix}-secondary-resources",
+ "location": "${var.location_secondary}",
+ "compiletime_identity": "azurerm_resource_group.secondary"
+ }
+ },
+ {
+ "type": "azurerm_sql_managed_instance_failover_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-fog",
+ "resource_group_name": "${azurerm_resource_group.primary.name}",
+ "location": "${azurerm_resource_group.primary.location}",
+ "managed_instance_name": "${module.primary.managed_instance_name}",
+ "partner_managed_instance_id": "${module.secondary.managed_instance_id}",
+ "read_write_endpoint_failover_policy": [
+ {
+ "mode": "Manual"
+ }
+ ],
+ "depends_on": [
+ {
+ "shared_key": "s3cre7_key!",
+ "prefix": "${var.prefix}",
+ "location_1": "${azurerm_resource_group.primary.location}",
+ "resource_group_name_1": "${azurerm_resource_group.primary.name}",
+ "vnet_name_1": "${module.primary.vnet_name}",
+ "gateway_subnet_range_1": "10.0.1.0/24",
+ "location_2": "${azurerm_resource_group.secondary.location}",
+ "resource_group_name_2": "${azurerm_resource_group.secondary.name}",
+ "vnet_name_2": "${module.secondary.vnet_name}",
+ "gateway_subnet_range_2": "10.0.2.0/24"
+ }
+ ],
+ "compiletime_identity": "azurerm_sql_managed_instance_failover_group.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT11 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT11
new file mode 100644
index 0000000..4cc8c12
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT11
@@ -0,0 +1,93 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/linux-basic/outputs.tf",
+ "/examples/app-service/linux-basic/variables.tf",
+ "/examples/app-service/linux-basic/main.tf"
+ ],
+ "timestamp": 1642943279600,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-basic/outputs.tf",
+ "/examples/app-service/linux-basic/variables.tf",
+ "/examples/app-service/linux-basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT11",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT11",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "kind": "Linux",
+ "reserved": true,
+ "sku": [
+ {
+ "tier": "Standard",
+ "size": "S1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.main.id}",
+ "site_config": [
+ {
+ "dotnet_framework_version": "v4.0",
+ "remote_debugging_enabled": true,
+ "remote_debugging_version": "VS2019"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT110 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT110
new file mode 100644
index 0000000..7754d0a
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT110
@@ -0,0 +1,177 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/sql-azure/sql_auditing_eventhub/variables.tf",
+ "/examples/sql-azure/sql_auditing_eventhub/main.tf"
+ ],
+ "timestamp": 1642943279962,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/sql_auditing_eventhub/variables.tf",
+ "/examples/sql-azure/sql_auditing_eventhub/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT110",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_eventhub_namespace",
+ "azurerm_mssql_server",
+ "azurerm_resource_group",
+ "azurerm_eventhub_namespace_authorization_rule",
+ "azurerm_eventhub",
+ "azurerm_mssql_server_extended_auditing_policy",
+ "azurerm_mssql_database",
+ "azurerm_monitor_diagnostic_setting",
+ "azurerm_mssql_database_extended_auditing_policy"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT110",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_server",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-server-primary",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${var.location}",
+ "version": 12.0,
+ "administrator_login": "mradministrator",
+ "administrator_login_password": "thisIsDog11",
+ "compiletime_identity": "azurerm_mssql_server.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_database",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-db-primary",
+ "server_id": "${azurerm_mssql_server.example.id}",
+ "compiletime_identity": "azurerm_mssql_database.example"
+ }
+ },
+ {
+ "type": "azurerm_eventhub_namespace",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-EHN",
+ "location": "${var.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "sku": "Standard",
+ "compiletime_identity": "azurerm_eventhub_namespace.example"
+ }
+ },
+ {
+ "type": "azurerm_eventhub",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-EH",
+ "namespace_name": "${azurerm_eventhub_namespace.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "partition_count": 2,
+ "message_retention": 1,
+ "compiletime_identity": "azurerm_eventhub.example"
+ }
+ },
+ {
+ "type": "azurerm_eventhub_namespace_authorization_rule",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}EHRule",
+ "namespace_name": "${azurerm_eventhub_namespace.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "listen": true,
+ "send": true,
+ "manage": true,
+ "compiletime_identity": "azurerm_eventhub_namespace_authorization_rule.example"
+ }
+ },
+ {
+ "type": "azurerm_monitor_diagnostic_setting",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-DS",
+ "target_resource_id": "${azurerm_mssql_database.example.id}",
+ "eventhub_authorization_rule_id": "${azurerm_eventhub_namespace_authorization_rule.example.id}",
+ "eventhub_name": "${azurerm_eventhub.example.name}",
+ "log": [
+ {
+ "category": "SQLSecurityAuditEvents",
+ "enabled": true,
+ "retention_policy": [
+ {
+ "enabled": false
+ }
+ ]
+ }
+ ],
+ "metric": [
+ {
+ "category": "AllMetrics",
+ "retention_policy": [
+ {
+ "enabled": false
+ }
+ ]
+ }
+ ],
+ "lifecycle": [
+ {
+ "ignore_changes": [
+ "log",
+ "metric"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_diagnostic_setting.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_database_extended_auditing_policy",
+ "name": "example",
+ "properties": {
+ "database_id": "${azurerm_mssql_database.example.id}",
+ "log_monitoring_enabled": true,
+ "compiletime_identity": "azurerm_mssql_database_extended_auditing_policy.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_server_extended_auditing_policy",
+ "name": "example",
+ "properties": {
+ "server_id": "${azurerm_mssql_server.example.id}",
+ "log_monitoring_enabled": true,
+ "compiletime_identity": "azurerm_mssql_server_extended_auditing_policy.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT111 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT111
new file mode 100644
index 0000000..cc506fe
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT111
@@ -0,0 +1,150 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/sql-azure/sql_auditing_log_analytics/variables.tf",
+ "/examples/sql-azure/sql_auditing_log_analytics/main.tf"
+ ],
+ "timestamp": 1642943279966,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/sql-azure/sql_auditing_log_analytics/variables.tf",
+ "/examples/sql-azure/sql_auditing_log_analytics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT111",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_mssql_server",
+ "azurerm_log_analytics_workspace",
+ "azurerm_resource_group",
+ "azurerm_mssql_server_extended_auditing_policy",
+ "azurerm_mssql_database",
+ "azurerm_monitor_diagnostic_setting",
+ "azurerm_mssql_database_extended_auditing_policy"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT111",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_server",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-server-primary",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${var.location}",
+ "version": 12.0,
+ "administrator_login": "mradministrator",
+ "administrator_login_password": "thisIsDog11",
+ "compiletime_identity": "azurerm_mssql_server.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_database",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-db-primary",
+ "server_id": "${azurerm_mssql_server.example.id}",
+ "compiletime_identity": "azurerm_mssql_database.example"
+ }
+ },
+ {
+ "type": "azurerm_log_analytics_workspace",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-LAW",
+ "location": "${var.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "sku": "PerGB2018",
+ "retention_in_days": 30,
+ "compiletime_identity": "azurerm_log_analytics_workspace.example"
+ }
+ },
+ {
+ "type": "azurerm_monitor_diagnostic_setting",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-DS",
+ "target_resource_id": "${azurerm_mssql_server.example.id}/databases/master",
+ "log_analytics_workspace_id": "${azurerm_log_analytics_workspace.example.id}",
+ "log": [
+ {
+ "category": "SQLSecurityAuditEvents",
+ "enabled": true,
+ "retention_policy": [
+ {
+ "enabled": false
+ }
+ ]
+ }
+ ],
+ "metric": [
+ {
+ "category": "AllMetrics",
+ "retention_policy": [
+ {
+ "enabled": false
+ }
+ ]
+ }
+ ],
+ "lifecycle": [
+ {
+ "ignore_changes": [
+ "log",
+ "metric"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_diagnostic_setting.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_database_extended_auditing_policy",
+ "name": "example",
+ "properties": {
+ "database_id": "${azurerm_mssql_server.example.id}/databases/master",
+ "log_monitoring_enabled": true,
+ "compiletime_identity": "azurerm_mssql_database_extended_auditing_policy.example"
+ }
+ },
+ {
+ "type": "azurerm_mssql_server_extended_auditing_policy",
+ "name": "example",
+ "properties": {
+ "server_id": "${azurerm_mssql_server.example.id}",
+ "log_monitoring_enabled": true,
+ "compiletime_identity": "azurerm_mssql_server_extended_auditing_policy.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT112 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT112
new file mode 100644
index 0000000..f2017c3
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT112
@@ -0,0 +1,74 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/storage/storage-account/variables.tf",
+ "/examples/storage/storage-account/main.tf"
+ ],
+ "timestamp": 1642943279970,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage-account/variables.tf",
+ "/examples/storage/storage-account/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT112",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT112",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}storageacct",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "network_rules": [
+ {
+ "default_action": "Deny",
+ "ip_rules": [
+ "23.45.1.0/30"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT113 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT113
new file mode 100644
index 0000000..e81b1dc
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT113
@@ -0,0 +1,107 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/storage/storage-container/variables.tf",
+ "/examples/storage/storage-container/main.tf"
+ ],
+ "timestamp": 1642943279973,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage-container/variables.tf",
+ "/examples/storage/storage-container/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT113",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_storage_container",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT113",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}storageacct",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_kind": "StorageV2",
+ "account_replication_type": "LRS",
+ "enable_https_traffic_only": true,
+ "access_tier": "Hot",
+ "allow_blob_public_access": true,
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example2",
+ "properties": {
+ "name": "${var.prefix}storageacct2",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_kind": "StorageV2",
+ "account_replication_type": "LRS",
+ "enable_https_traffic_only": true,
+ "access_tier": "Hot",
+ "allow_blob_public_access": true,
+ "compiletime_identity": "azurerm_storage_account.example2"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}storagecontainer",
+ "storage_account_name": "${azurerm_storage_account.example.name}",
+ "container_access_type": "blob",
+ "compiletime_identity": "azurerm_storage_container.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "example2",
+ "properties": {
+ "name": "${var.prefix}storagecontainer2",
+ "storage_account_name": "${azurerm_storage_account.example2.name}",
+ "container_access_type": "blob",
+ "compiletime_identity": "azurerm_storage_container.example2"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT114 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT114
new file mode 100644
index 0000000..bd55ecf
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT114
@@ -0,0 +1,77 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/storage/storage-share/variables.tf",
+ "/examples/storage/storage-share/main.tf"
+ ],
+ "timestamp": 1642943279977,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage-share/variables.tf",
+ "/examples/storage/storage-share/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT114",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_storage_account",
+ "azurerm_resource_group",
+ "azurerm_storage_share"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT114",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}storageacct",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Premium",
+ "account_replication_type": "LRS",
+ "account_kind": "FileStorage",
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_share",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}storageshare",
+ "storage_account_name": "${azurerm_storage_account.example.name}",
+ "compiletime_identity": "azurerm_storage_share.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT115 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT115
new file mode 100644
index 0000000..6d81002
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT115
@@ -0,0 +1,194 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/storage/storage_adls_acls/variables.tf",
+ "/examples/storage/storage_adls_acls/main.tf"
+ ],
+ "timestamp": 1642943279981,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/storage/storage_adls_acls/variables.tf",
+ "/examples/storage/storage_adls_acls/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT115",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_role_assignment",
+ "azurerm_storage_data_lake_gen2_path",
+ "azurerm_storage_account",
+ "azurerm_storage_data_lake_gen2_filesystem",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT115",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "data": {
+ "azurerm_client_config": {
+ "current": {
+ "compiletime_identity": "data.azurerm_client_config.current"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_user_assigned_identity",
+ "name": "example",
+ "properties": {
+ "name": "search-api",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "compiletime_identity": "azurerm_user_assigned_identity.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}storageacct",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_kind": "StorageV2",
+ "account_replication_type": "LRS",
+ "is_hns_enabled": true,
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ },
+ {
+ "type": "azurerm_role_assignment",
+ "name": "storageAccountRoleAssignment",
+ "properties": {
+ "scope": "${azurerm_storage_account.example.id}",
+ "role_definition_name": "Storage Blob Data Contributor",
+ "principal_id": "${data.azurerm_client_config.current.object_id}",
+ "compiletime_identity": "azurerm_role_assignment.storageAccountRoleAssignment"
+ }
+ },
+ {
+ "type": "azurerm_storage_data_lake_gen2_filesystem",
+ "name": "example",
+ "properties": {
+ "name": "example",
+ "storage_account_id": "${azurerm_storage_account.example.id}",
+ "ace": [
+ {
+ "type": "user",
+ "permissions": "rwx"
+ },
+ {
+ "type": "user",
+ "id": "${azurerm_user_assigned_identity.example.principal_id}",
+ "permissions": "--x"
+ },
+ {
+ "type": "group",
+ "permissions": "r-x"
+ },
+ {
+ "type": "mask",
+ "permissions": "r-x"
+ },
+ {
+ "type": "other",
+ "permissions": "---"
+ }
+ ],
+ "depends_on": [
+ "${azurerm_role_assignment.storageAccountRoleAssignment}"
+ ],
+ "compiletime_identity": "azurerm_storage_data_lake_gen2_filesystem.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_data_lake_gen2_path",
+ "name": "example",
+ "properties": {
+ "storage_account_id": "${azurerm_storage_account.example.id}",
+ "filesystem_name": "${azurerm_storage_data_lake_gen2_filesystem.example.name}",
+ "path": "testpath",
+ "resource": "directory",
+ "ace": [
+ {
+ "type": "user",
+ "permissions": "r-x"
+ },
+ {
+ "type": "user",
+ "id": "${azurerm_user_assigned_identity.example.principal_id}",
+ "permissions": "r-x"
+ },
+ {
+ "type": "group",
+ "permissions": "-wx"
+ },
+ {
+ "type": "mask",
+ "permissions": "--x"
+ },
+ {
+ "type": "other",
+ "permissions": "--x"
+ },
+ {
+ "scope": "default",
+ "type": "user",
+ "permissions": "r-x"
+ },
+ {
+ "scope": "default",
+ "type": "user",
+ "id": "${azurerm_user_assigned_identity.example.principal_id}",
+ "permissions": "r-x"
+ },
+ {
+ "scope": "default",
+ "type": "group",
+ "permissions": "-wx"
+ },
+ {
+ "scope": "default",
+ "type": "mask",
+ "permissions": "--x"
+ },
+ {
+ "scope": "default",
+ "type": "other",
+ "permissions": "--x"
+ }
+ ],
+ "compiletime_identity": "azurerm_storage_data_lake_gen2_path.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT116 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT116
new file mode 100644
index 0000000..e486864
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT116
@@ -0,0 +1,122 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/stream-analytics/variables.tf",
+ "/examples/stream-analytics/main.tf"
+ ],
+ "timestamp": 1642943279985,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/stream-analytics/variables.tf",
+ "/examples/stream-analytics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT116",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_storage_container",
+ "azurerm_stream_analytics_job",
+ "azurerm_storage_account",
+ "azurerm_stream_analytics_reference_input_blob"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT116",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-example-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-examplestoracc",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}example",
+ "storage_account_name": "${azurerm_storage_account.example.name}",
+ "container_access_type": "private",
+ "compiletime_identity": "azurerm_storage_container.example"
+ }
+ },
+ {
+ "type": "azurerm_stream_analytics_job",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-example-job",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "compatibility_level": 1.1,
+ "data_locale": "en-US",
+ "events_late_arrival_max_delay_in_seconds": 60,
+ "events_out_of_order_max_delay_in_seconds": 50,
+ "events_out_of_order_policy": "Adjust",
+ "output_error_policy": "Drop",
+ "streaming_units": 3,
+ "tags": {
+ "environment": "Example"
+ },
+ "transformation_query": "SELECT *\n INTO [YourOutputAlias]\n FROM [YourInputAlias]",
+ "compiletime_identity": "azurerm_stream_analytics_job.example"
+ }
+ },
+ {
+ "type": "azurerm_stream_analytics_reference_input_blob",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}-blob-reference-input",
+ "stream_analytics_job_name": "${azurerm_stream_analytics_job.example.name}",
+ "resource_group_name": "${azurerm_stream_analytics_job.example.resource_group_name}",
+ "storage_account_name": "${azurerm_storage_account.example.name}",
+ "storage_account_key": "${azurerm_storage_account.example.primary_access_key}",
+ "storage_container_name": "${azurerm_storage_container.example.name}",
+ "path_pattern": "some-random-pattern",
+ "date_format": "yyyy/MM/dd",
+ "time_format": "HH",
+ "serialization": [
+ {
+ "type": "Json",
+ "encoding": "UTF8"
+ }
+ ],
+ "compiletime_identity": "azurerm_stream_analytics_reference_input_blob.test"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT117 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT117
new file mode 100644
index 0000000..839af17
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT117
@@ -0,0 +1,80 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/traffic-manager/basic/variables.tf",
+ "/examples/traffic-manager/basic/main.tf"
+ ],
+ "timestamp": 1642943279988,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/traffic-manager/basic/variables.tf",
+ "/examples/traffic-manager/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT117",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_traffic_manager_profile",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT117",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_traffic_manager_profile",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-trafficmanager",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "traffic_routing_method": "Weighted",
+ "dns_config": [
+ {
+ "relative_name": "${azurerm_resource_group.example.name}",
+ "ttl": 30
+ }
+ ],
+ "monitor_config": [
+ {
+ "protocol": "http",
+ "port": 80,
+ "path": "/",
+ "interval_in_seconds": 30,
+ "timeout_in_seconds": 9,
+ "tolerated_number_of_failures": 3
+ }
+ ],
+ "compiletime_identity": "azurerm_traffic_manager_profile.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT118 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT118
new file mode 100644
index 0000000..31ef3df
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT118
@@ -0,0 +1,305 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/traffic-manager/virtual-machine/outputs.tf",
+ "/examples/traffic-manager/virtual-machine/variables.tf",
+ "/examples/traffic-manager/virtual-machine/main.tf"
+ ],
+ "timestamp": 1642943279992,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/traffic-manager/virtual-machine/outputs.tf",
+ "/examples/traffic-manager/virtual-machine/variables.tf",
+ "/examples/traffic-manager/virtual-machine/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT118",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_traffic_manager_endpoint",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_traffic_manager_profile",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT118",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${data.azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "prefix": "${var.prefix}",
+ "compiletime_identity": "module.virtual-network"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${var.prefix}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "prefix": "${var.prefix}",
+ "compiletime_identity": "module.virtual-network"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}1",
+ "location": "${data.azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "example",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "prefix": "${var.prefix}1",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "compiletime_identity": "module.first-virtual-machine"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}2",
+ "location": "${data.azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "example",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "prefix": "${var.prefix}2",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "compiletime_identity": "module.second-virtual-machine"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}1",
+ "location": "${data.azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_DS1_v2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "myosdisk1",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "prefix": "${var.prefix}1",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "compiletime_identity": "module.first-virtual-machine"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}2",
+ "location": "${data.azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_DS1_v2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "myosdisk1",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "prefix": "${var.prefix}2",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "compiletime_identity": "module.second-virtual-machine"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "example",
+ "properties": {
+ "name": "CustomScript",
+ "virtual_machine_id": "${azurerm_virtual_machine.example.id}",
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "type_handler_version": 2.0,
+ "auto_upgrade_minor_version": true,
+ "settings": {
+ "commandToExecute": "sudo bash -c 'apt-get update && apt-get -y install apache2'"
+ },
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "prefix": "${var.prefix}1",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "compiletime_identity": "module.first-virtual-machine"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "example",
+ "properties": {
+ "name": "CustomScript",
+ "virtual_machine_id": "${azurerm_virtual_machine.example.id}",
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "type_handler_version": 2.0,
+ "auto_upgrade_minor_version": true,
+ "settings": {
+ "commandToExecute": "sudo bash -c 'apt-get update && apt-get -y install apache2'"
+ },
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "prefix": "${var.prefix}2",
+ "subnet_id": "${module.virtual-network.subnet_id}",
+ "compiletime_identity": "module.second-virtual-machine"
+ }
+ },
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_traffic_manager_profile",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-tmprofile",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "traffic_routing_method": "Weighted",
+ "dns_config": [
+ {
+ "relative_name": "${azurerm_resource_group.example.name}",
+ "ttl": 30
+ }
+ ],
+ "monitor_config": [
+ {
+ "protocol": "http",
+ "port": 80,
+ "path": "/"
+ }
+ ],
+ "compiletime_identity": "azurerm_traffic_manager_profile.example"
+ }
+ },
+ {
+ "type": "azurerm_traffic_manager_endpoint",
+ "name": "first-vm",
+ "properties": {
+ "name": "${var.prefix}-first-vm",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "profile_name": "${azurerm_traffic_manager_profile.example.name}",
+ "target_resource_id": "${module.first-virtual-machine.network_interface_id}",
+ "type": "azureEndpoints",
+ "weight": 1,
+ "compiletime_identity": "azurerm_traffic_manager_endpoint.first-vm"
+ }
+ },
+ {
+ "type": "azurerm_traffic_manager_endpoint",
+ "name": "second-vm",
+ "properties": {
+ "name": "${var.prefix}-second-vm",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "profile_name": "${azurerm_traffic_manager_profile.example.name}",
+ "target_resource_id": "${module.second-virtual-machine.network_interface_id}",
+ "type": "azureEndpoints",
+ "weight": 1,
+ "compiletime_identity": "azurerm_traffic_manager_endpoint.second-vm"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT119 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT119
new file mode 100644
index 0000000..98449cd
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT119
@@ -0,0 +1,484 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/traffic-manager/vm-scale-set/variables.tf",
+ "/examples/traffic-manager/vm-scale-set/main.tf"
+ ],
+ "timestamp": 1642943279997,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/traffic-manager/vm-scale-set/variables.tf",
+ "/examples/traffic-manager/vm-scale-set/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT119",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_traffic_manager_endpoint",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_traffic_manager_profile",
+ "azurerm_virtual_machine_scale_set",
+ "azurerm_lb_probe"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT119",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${var.location}",
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${var.alt_location}",
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-tmresources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "resource_group_name": "${var.prefix}-region1",
+ "location": "${var.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "resource_group_name": "${var.prefix}-region1",
+ "location": "${var.alt_location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${var.prefix}-region1",
+ "resource_group_name": "${var.prefix}-region1",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.location}",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${var.prefix}-region1",
+ "resource_group_name": "${var.prefix}-region1",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.alt_location}",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Static",
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Static",
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "${local.frontend_ip_configuration_name}",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "${local.frontend_ip_configuration_name}",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "example",
+ "properties": {
+ "name": "backend",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.location}",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "example",
+ "properties": {
+ "name": "backend",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.alt_location}",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "example",
+ "properties": {
+ "name": "probe",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "protocol": "tcp",
+ "port": 80,
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.location}",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "example",
+ "properties": {
+ "name": "probe",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "protocol": "tcp",
+ "port": 80,
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.alt_location}",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "example",
+ "properties": {
+ "name": "http-lb-rule",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "probe_id": "${azurerm_lb_probe.example.id}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.example.id}",
+ "frontend_ip_configuration_name": "${local.frontend_ip_configuration_name}",
+ "protocol": "Tcp",
+ "frontend_port": 80,
+ "backend_port": 80,
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.location}",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "example",
+ "properties": {
+ "name": "http-lb-rule",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "probe_id": "${azurerm_lb_probe.example.id}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.example.id}",
+ "frontend_ip_configuration_name": "${local.frontend_ip_configuration_name}",
+ "protocol": "Tcp",
+ "frontend_port": 80,
+ "backend_port": 80,
+ "prefix": "${var.prefix}-region1",
+ "location": "${var.alt_location}",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_scale_set",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "upgrade_policy_mode": "Manual",
+ "sku": [
+ {
+ "name": "Standard_D1_v2",
+ "tier": "Standard",
+ "capacity": 2
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name_prefix": "${var.prefix}-region1",
+ "admin_username": "myadmin",
+ "admin_password": "Passwword1234"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "network_profile": [
+ {
+ "name": "web_ss_net_profile",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "load_balancer_backend_address_pool_ids": [
+ "${azurerm_lb_backend_address_pool.example.id}"
+ ],
+ "primary": true
+ }
+ ]
+ }
+ ],
+ "storage_profile_os_disk": [
+ {
+ "name": "",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "storage_profile_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "extension": [
+ {
+ "name": "CustomScriptForLinux",
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "CustomScriptForLinux",
+ "type_handler_version": 1.4,
+ "settings": {
+ "commandToExecute": "sudo apt-get -y install apache2"
+ }
+ }
+ ],
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region1"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_scale_set",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "upgrade_policy_mode": "Manual",
+ "sku": [
+ {
+ "name": "Standard_D1_v2",
+ "tier": "Standard",
+ "capacity": 2
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name_prefix": "${var.prefix}-region1",
+ "admin_username": "myadmin",
+ "admin_password": "Passwword1234"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "network_profile": [
+ {
+ "name": "web_ss_net_profile",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "load_balancer_backend_address_pool_ids": [
+ "${azurerm_lb_backend_address_pool.example.id}"
+ ],
+ "primary": true
+ }
+ ]
+ }
+ ],
+ "storage_profile_os_disk": [
+ {
+ "name": "",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "storage_profile_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "extension": [
+ {
+ "name": "CustomScriptForLinux",
+ "publisher": "Microsoft.OSTCExtensions",
+ "type": "CustomScriptForLinux",
+ "type_handler_version": 1.4,
+ "settings": {
+ "commandToExecute": "sudo apt-get -y install apache2"
+ }
+ }
+ ],
+ "prefix": "${var.prefix}-region1",
+ "compiletime_identity": "module.region2"
+ }
+ },
+ {
+ "type": "azurerm_traffic_manager_profile",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-trafficmgr",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "traffic_routing_method": "Weighted",
+ "dns_config": [
+ {
+ "relative_name": "${var.prefix}-trafficmgr",
+ "ttl": 100
+ }
+ ],
+ "monitor_config": [
+ {
+ "protocol": "http",
+ "port": 80,
+ "path": "/"
+ }
+ ],
+ "compiletime_identity": "azurerm_traffic_manager_profile.example"
+ }
+ },
+ {
+ "type": "azurerm_traffic_manager_endpoint",
+ "name": "region1",
+ "properties": {
+ "name": "${var.prefix}-region1",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "profile_name": "${azurerm_traffic_manager_profile.example.name}",
+ "target_resource_id": "${module.region1.public_ip_address_id}",
+ "type": "azureEndpoints",
+ "weight": 100,
+ "compiletime_identity": "azurerm_traffic_manager_endpoint.region1"
+ }
+ },
+ {
+ "type": "azurerm_traffic_manager_endpoint",
+ "name": "region2",
+ "properties": {
+ "name": "${var.prefix}-region2",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "profile_name": "${azurerm_traffic_manager_profile.example.name}",
+ "target_resource_id": "${module.region2.public_ip_address_id}",
+ "type": "azureEndpoints",
+ "weight": 100,
+ "compiletime_identity": "azurerm_traffic_manager_endpoint.region2"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT12 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT12
new file mode 100644
index 0000000..0dbaa4c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT12
@@ -0,0 +1,91 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/linux-nodejs/outputs.tf",
+ "/examples/app-service/linux-nodejs/variables.tf",
+ "/examples/app-service/linux-nodejs/main.tf"
+ ],
+ "timestamp": 1642943279603,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-nodejs/outputs.tf",
+ "/examples/app-service/linux-nodejs/variables.tf",
+ "/examples/app-service/linux-nodejs/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT12",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT12",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "kind": "Linux",
+ "reserved": true,
+ "sku": [
+ {
+ "tier": "Standard",
+ "size": "S1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.main.id}",
+ "site_config": [
+ {
+ "linux_fx_version": "NODE|10.14"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT120 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT120
new file mode 100644
index 0000000..3e04e68
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT120
@@ -0,0 +1,131 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/basic-password/variables.tf",
+ "/examples/virtual-machines/linux/basic-password/main.tf"
+ ],
+ "timestamp": 1642943280001,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/basic-password/variables.tf",
+ "/examples/virtual-machines/linux/basic-password/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT120",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT120",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/22"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_D2s_v3",
+ "admin_username": "${var.username}",
+ "admin_password": "${var.password}",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "18.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT121 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT121
new file mode 100644
index 0000000..2fd9029
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT121
@@ -0,0 +1,135 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/basic-ssh/variables.tf",
+ "/examples/virtual-machines/linux/basic-ssh/main.tf"
+ ],
+ "timestamp": 1642943280004,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/basic-ssh/variables.tf",
+ "/examples/virtual-machines/linux/basic-ssh/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT121",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT121",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "admin_ssh_key": [
+ {
+ "username": "adminuser",
+ "public_key": "${file(\"~/.ssh/id_rsa.pub\")}"
+ }
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT122 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT122
new file mode 100644
index 0000000..ec72272
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT122
@@ -0,0 +1,132 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/custom-data/variables.tf",
+ "/examples/virtual-machines/linux/custom-data/main.tf"
+ ],
+ "timestamp": 1642943280008,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/custom-data/variables.tf",
+ "/examples/virtual-machines/linux/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT122",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT122",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "custom_data": "base64encode(\"Hello World!\")",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT123 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT123
new file mode 100644
index 0000000..7dce187
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT123
@@ -0,0 +1,136 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/ephemeral-os-disk/variables.tf",
+ "/examples/virtual-machines/linux/ephemeral-os-disk/main.tf"
+ ],
+ "timestamp": 1642943280015,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/ephemeral-os-disk/variables.tf",
+ "/examples/virtual-machines/linux/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT123",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT123",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2s_v2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite",
+ "diff_disk_settings": [
+ {
+ "option": "Local"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT124 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT124
new file mode 100644
index 0000000..4c0f795
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT124
@@ -0,0 +1,244 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/load-balanced/variables.tf",
+ "/examples/virtual-machines/linux/load-balanced/main.tf"
+ ],
+ "timestamp": 1642943280019,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/load-balanced/variables.tf",
+ "/examples/virtual-machines/linux/load-balanced/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT124",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_network_security_group",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_interface_backend_address_pool_association",
+ "azurerm_lb",
+ "azurerm_lb_nat_rule"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT124",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "instance_count": 2
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "pip",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "allocation_method": "Dynamic",
+ "compiletime_identity": "azurerm_public_ip.pip"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "count": "${local.instance_count}",
+ "name": "${var.prefix}-nic${count.index}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_availability_set",
+ "name": "avset",
+ "properties": {
+ "name": "${var.prefix}avset",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "platform_fault_domain_count": 2,
+ "platform_update_domain_count": 2,
+ "managed": true,
+ "compiletime_identity": "azurerm_availability_set.avset"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "webserver",
+ "properties": {
+ "name": "tls_webserver",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "security_rule": [
+ {
+ "access": "Allow",
+ "direction": "Inbound",
+ "name": "tls",
+ "priority": 100,
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_port_range": 443,
+ "destination_address_prefix": "${azurerm_subnet.internal.address_prefix}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.webserver"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-lb",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "PublicIPAddress",
+ "public_ip_address_id": "${azurerm_public_ip.pip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "BackEndAddressPool",
+ "compiletime_identity": "azurerm_lb_backend_address_pool.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_rule",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "HTTPSAccess",
+ "protocol": "Tcp",
+ "frontend_port": 443,
+ "backend_port": 443,
+ "frontend_ip_configuration_name": "${azurerm_lb.example.frontend_ip_configuration[0].name}",
+ "compiletime_identity": "azurerm_lb_nat_rule.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface_backend_address_pool_association",
+ "name": "example",
+ "properties": {
+ "count": "${local.instance_count}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.example.id}",
+ "ip_configuration_name": "primary",
+ "network_interface_id": "element(azurerm_network_interface.main.*.id,count.index)",
+ "compiletime_identity": "azurerm_network_interface_backend_address_pool_association.example"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "count": "${local.instance_count}",
+ "name": "${var.prefix}-vm${count.index}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "availability_set_id": "${azurerm_availability_set.avset.id}",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.main[count.index].id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT125 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT125
new file mode 100644
index 0000000..1b83692
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT125
@@ -0,0 +1,157 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/managed-disk-attachments/variables.tf",
+ "/examples/virtual-machines/linux/managed-disk-attachments/main.tf"
+ ],
+ "timestamp": 1642943280023,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/managed-disk-attachments/variables.tf",
+ "/examples/virtual-machines/linux/managed-disk-attachments/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT125",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine",
+ "azurerm_virtual_machine_data_disk_attachment",
+ "azurerm_managed_disk"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT125",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ },
+ {
+ "type": "azurerm_managed_disk",
+ "name": "data",
+ "properties": {
+ "name": "data",
+ "location": "${azurerm_resource_group.main.location}",
+ "create_option": "Empty",
+ "disk_size_gb": 10,
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "storage_account_type": "Standard_LRS",
+ "compiletime_identity": "azurerm_managed_disk.data"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_data_disk_attachment",
+ "name": "data",
+ "properties": {
+ "virtual_machine_id": "${azurerm_linux_virtual_machine.main.id}",
+ "managed_disk_id": "${azurerm_managed_disk.data.id}",
+ "lun": 0,
+ "caching": null,
+ "compiletime_identity": "azurerm_virtual_machine_data_disk_attachment.data"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT126 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT126
new file mode 100644
index 0000000..0507705
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT126
@@ -0,0 +1,160 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/provisioner/variables.tf",
+ "/examples/virtual-machines/linux/provisioner/main.tf"
+ ],
+ "timestamp": 1642943280027,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/provisioner/variables.tf",
+ "/examples/virtual-machines/linux/provisioner/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT126",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT126",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.main"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.main.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "provisioner": [
+ {
+ "remote-exec": {
+ "inline": [
+ "ls -la /tmp"
+ ],
+ "connection": [
+ {
+ "host": "${self.public_ip_address}",
+ "user": "${self.admin_username}",
+ "password": "${self.admin_password}"
+ }
+ ]
+ }
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT127 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT127
new file mode 100644
index 0000000..1892d6e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT127
@@ -0,0 +1,196 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/linux/public-ip/variables.tf",
+ "/examples/virtual-machines/linux/public-ip/main.tf"
+ ],
+ "timestamp": 1642943280031,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/linux/public-ip/variables.tf",
+ "/examples/virtual-machines/linux/public-ip/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT127",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_security_group",
+ "azurerm_network_interface_security_group_association"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT127",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "pip",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "allocation_method": "Dynamic",
+ "compiletime_identity": "azurerm_public_ip.pip"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic1",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.pip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "internal",
+ "properties": {
+ "name": "${var.prefix}-nic2",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "webserver",
+ "properties": {
+ "name": "tls_webserver",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "security_rule": [
+ {
+ "access": "Allow",
+ "direction": "Inbound",
+ "name": "tls",
+ "priority": 100,
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_port_range": 443,
+ "destination_address_prefix": "${azurerm_network_interface.main.private_ip_address}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.webserver"
+ }
+ },
+ {
+ "type": "azurerm_network_interface_security_group_association",
+ "name": "main",
+ "properties": {
+ "network_interface_id": "${azurerm_network_interface.internal.id}",
+ "network_security_group_id": "${azurerm_network_security_group.webserver.id}",
+ "compiletime_identity": "azurerm_network_interface_security_group_association.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}",
+ "${azurerm_network_interface.internal.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT128 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT128
new file mode 100644
index 0000000..51754df
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT128
@@ -0,0 +1,352 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/variables.tf",
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/main.tf"
+ ],
+ "timestamp": 1642943280035,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/variables.tf",
+ "/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT128",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_storage_account",
+ "azurerm_network_interface_nat_rule_association",
+ "azurerm_lb_probe",
+ "azurerm_lb_nat_rule"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT128",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "rg",
+ "properties": {
+ "name": "${var.resource_group}",
+ "location": "southcentralus",
+ "compiletime_identity": "azurerm_resource_group.rg"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "stor",
+ "properties": {
+ "name": "${var.dns_name}stor",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.stor"
+ }
+ },
+ {
+ "type": "azurerm_availability_set",
+ "name": "avset",
+ "properties": {
+ "name": "${var.dns_name}avset",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "platform_fault_domain_count": 2,
+ "platform_update_domain_count": 2,
+ "managed": true,
+ "compiletime_identity": "azurerm_availability_set.avset"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "lbpip",
+ "properties": {
+ "name": "rg-ip",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "allocation_method": "Dynamic",
+ "domain_name_label": "${var.lb_ip_dns_name}",
+ "compiletime_identity": "azurerm_public_ip.lbpip"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "vnet",
+ "properties": {
+ "name": "vnet",
+ "location": "southcentralus",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "compiletime_identity": "azurerm_virtual_network.vnet"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet",
+ "properties": {
+ "name": "rgsubnet",
+ "virtual_network_name": "${azurerm_virtual_network.vnet.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.0.10.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.subnet"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "lb",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "name": "rglb",
+ "location": "southcentralus",
+ "frontend_ip_configuration": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "public_ip_address_id": "${azurerm_public_ip.lbpip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.lb"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "backend_pool",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.lb.id}",
+ "name": "BackendPool1",
+ "compiletime_identity": "azurerm_lb_backend_address_pool.backend_pool"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_rule",
+ "name": "tcp",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.lb.id}",
+ "name": "RDP-VM-0",
+ "protocol": "tcp",
+ "frontend_port": "5000${count.index + 1}",
+ "backend_port": 3389,
+ "frontend_ip_configuration_name": "LoadBalancerFrontEnd",
+ "compiletime_identity": "azurerm_lb_nat_rule.tcp"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_rule",
+ "name": "tcp",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.lb.id}",
+ "name": "RDP-VM-1",
+ "protocol": "tcp",
+ "frontend_port": "5000${count.index + 1}",
+ "backend_port": 3389,
+ "frontend_ip_configuration_name": "LoadBalancerFrontEnd",
+ "compiletime_identity": "azurerm_lb_nat_rule.tcp"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "lb_rule",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.lb.id}",
+ "name": "LBRule",
+ "protocol": "tcp",
+ "frontend_port": 80,
+ "backend_port": 80,
+ "frontend_ip_configuration_name": "LoadBalancerFrontEnd",
+ "enable_floating_ip": false,
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.backend_pool.id}",
+ "idle_timeout_in_minutes": 5,
+ "probe_id": "${azurerm_lb_probe.lb_probe.id}",
+ "depends_on": [
+ "azurerm_lb_probe.lb_probe"
+ ],
+ "compiletime_identity": "azurerm_lb_rule.lb_rule"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "lb_probe",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.lb.id}",
+ "name": "tcpProbe",
+ "protocol": "tcp",
+ "port": 80,
+ "interval_in_seconds": 5,
+ "number_of_probes": 2,
+ "compiletime_identity": "azurerm_lb_probe.lb_probe"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "nic",
+ "properties": {
+ "name": "nic0",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "ip_configuration": [
+ {
+ "name": "ipconfig0",
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.nic"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "nic",
+ "properties": {
+ "name": "nic1",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "ip_configuration": [
+ {
+ "name": "ipconfig1",
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.nic"
+ }
+ },
+ {
+ "type": "azurerm_network_interface_nat_rule_association",
+ "name": "natrule",
+ "properties": {
+ "network_interface_id": "element(azurerm_network_interface.nic.*.id,0)",
+ "ip_configuration_name": "ipconfig0",
+ "nat_rule_id": "element(azurerm_lb_nat_rule.tcp.*.id,0)",
+ "compiletime_identity": "azurerm_network_interface_nat_rule_association.natrule"
+ }
+ },
+ {
+ "type": "azurerm_network_interface_nat_rule_association",
+ "name": "natrule",
+ "properties": {
+ "network_interface_id": "element(azurerm_network_interface.nic.*.id,1)",
+ "ip_configuration_name": "ipconfig1",
+ "nat_rule_id": "element(azurerm_lb_nat_rule.tcp.*.id,1)",
+ "compiletime_identity": "azurerm_network_interface_nat_rule_association.natrule"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "vm",
+ "properties": {
+ "name": "vm0",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "availability_set_id": "${azurerm_availability_set.avset.id}",
+ "vm_size": "Standard_D1_v2",
+ "network_interface_ids": [
+ "element(azurerm_network_interface.nic.*.id,0)"
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "osdisk0",
+ "create_option": "FromImage"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.hostname}",
+ "admin_username": "vmadmin",
+ "admin_password": "${var.admin_password}"
+ }
+ ],
+ "os_profile_windows_config": [
+ {}
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.vm"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "vm",
+ "properties": {
+ "name": "vm1",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "availability_set_id": "${azurerm_availability_set.avset.id}",
+ "vm_size": "Standard_D1_v2",
+ "network_interface_ids": [
+ "element(azurerm_network_interface.nic.*.id,1)"
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "osdisk1",
+ "create_option": "FromImage"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.hostname}",
+ "admin_username": "vmadmin",
+ "admin_password": "${var.admin_password}"
+ }
+ ],
+ "os_profile_windows_config": [
+ {}
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.vm"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT129 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT129
new file mode 100644
index 0000000..12d78bb
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT129
@@ -0,0 +1,150 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280040,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT129",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_group",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT129",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "bastion",
+ "properties": {
+ "name": "${azurerm_resource_group.example.name}-mgmt-nsg",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "security_rule": [
+ {
+ "name": "allow-ssh",
+ "description": "Allow SSH",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "Internet",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.bastion"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "web",
+ "properties": {
+ "name": "${azurerm_resource_group.example.name}-web",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "security_rule": [
+ {
+ "name": "allow-www",
+ "description": "Allow HTTP Traffic",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 80,
+ "source_address_prefix": "Internet",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow-internal-ssh",
+ "description": "Allow Internal SSH",
+ "priority": 101,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "VirtualNetwork",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.web"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "bastion",
+ "properties": {
+ "name": "${azurerm_resource_group.example.name}-bastion",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.0.128/25"
+ ],
+ "network_security_group_id": "${azurerm_network_security_group.bastion.id}",
+ "compiletime_identity": "azurerm_subnet.bastion"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "web",
+ "properties": {
+ "name": "${azurerm_resource_group.example.name}-web",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "network_security_group_id": "${azurerm_network_security_group.web.id}",
+ "compiletime_identity": "azurerm_subnet.web"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT13 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT13
new file mode 100644
index 0000000..dffdab9
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT13
@@ -0,0 +1,92 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/linux-php/outputs.tf",
+ "/examples/app-service/linux-php/variables.tf",
+ "/examples/app-service/linux-php/main.tf"
+ ],
+ "timestamp": 1642943279606,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/linux-php/outputs.tf",
+ "/examples/app-service/linux-php/variables.tf",
+ "/examples/app-service/linux-php/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT13",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT13",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "kind": "Linux",
+ "reserved": true,
+ "sku": [
+ {
+ "tier": "Standard",
+ "size": "S1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.example.id}",
+ "site_config": [
+ {
+ "linux_fx_version": "PHP|7.0",
+ "scm_type": "LocalGit"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT130 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT130
new file mode 100644
index 0000000..2b74b2e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT130
@@ -0,0 +1,51 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/2-generate-ssh.tf"
+ ],
+ "timestamp": 1642943280044,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/2-generate-ssh.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT130",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "tls_private_key"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT130",
+ "collection": "terraformtemplate",
+ "json": {
+ "locals": [
+ {
+ "public_ssh_key": "${tls_private_key.example.public_key_openssh}"
+ }
+ ],
+ "resources": [
+ {
+ "type": "tls_private_key",
+ "name": "example",
+ "properties": {
+ "algorithm": "RSA",
+ "rsa_bits": 2048,
+ "compiletime_identity": "tls_private_key.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT131 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT131
new file mode 100644
index 0000000..1403e76
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT131
@@ -0,0 +1,131 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/main.tf"
+ ],
+ "timestamp": 1642943280047,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/bastion-box/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/variables.tf",
+ "/examples/virtual-machines/virtual_machine/bastion-box/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT131",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT131",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "virtual_machine_name": "${var.prefix}-vm",
+ "admin_username": "testadmin"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${azurerm_resource_group.example.name}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_security_group_id": "${azurerm_network_security_group.bastion.id}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.bastion.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-bastionpip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Dynamic",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "storage_image_reference": [
+ {
+ "publisher": "MicrosoftOSTC",
+ "offer": "FreeBSD",
+ "sku": 11.1,
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${local.virtual_machine_name}-osdisk",
+ "managed_disk_type": "Standard_LRS",
+ "caching": "ReadWrite",
+ "create_option": "FromImage"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${local.virtual_machine_name}",
+ "admin_username": "${local.admin_username}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": true,
+ "ssh_keys": [
+ {
+ "path": "/home/${local.admin_username}/.ssh/authorized_keys",
+ "key_data": "${local.public_ssh_key}"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT132 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT132
new file mode 100644
index 0000000..19182ae
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT132
@@ -0,0 +1,396 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/variables.tf",
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/main.tf"
+ ],
+ "timestamp": 1642943280051,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/variables.tf",
+ "/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT132",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_template_deployment",
+ "azurerm_storage_account"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT132",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "rg",
+ "properties": {
+ "name": "${var.resource_group}",
+ "location": "southcentralus",
+ "compiletime_identity": "azurerm_resource_group.rg"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "vnet",
+ "properties": {
+ "name": "${var.hostname}vnet",
+ "location": "southcentralus",
+ "address_space": [
+ "10.0.0.0/24"
+ ],
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "compiletime_identity": "azurerm_virtual_network.vnet"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet",
+ "properties": {
+ "name": "${var.hostname}subnet",
+ "virtual_network_name": "${azurerm_virtual_network.vnet.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.0.0.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.subnet"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "nic",
+ "properties": {
+ "name": "nic",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "ip_configuration": [
+ {
+ "name": "ipconfig",
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.nic"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "stor",
+ "properties": {
+ "name": "${var.hostname}stor",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.stor"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "vm",
+ "properties": {
+ "name": "${var.hostname}",
+ "location": "southcentralus",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "vm_size": "Standard_F2",
+ "network_interface_ids": [
+ "${azurerm_network_interface.nic.id}"
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.hostname}osdisk",
+ "create_option": "FromImage",
+ "disk_size_gb": 30
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.hostname}",
+ "admin_username": "vmadmin",
+ "admin_password": "${var.admin_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.vm"
+ }
+ },
+ {
+ "type": "azurerm_template_deployment",
+ "name": "linux_vm",
+ "properties": {
+ "name": "encrypt",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "deployment_mode": "Incremental",
+ "depends_on": [
+ "azurerm_virtual_machine.vm"
+ ],
+ "template_body": {
+ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+ "contentVersion": "1.0.0.0",
+ "parameters": {
+ "aadClientID": {
+ "defaultValue": "${var.aad_client_id}",
+ "type": "string"
+ },
+ "aadClientSecret": {
+ "defaultValue": "${var.aad_client_secret}",
+ "type": "string"
+ },
+ "diskFormatQuery": {
+ "defaultValue": "",
+ "type": "string"
+ },
+ "encryptionOperation": {
+ "allowedValues": [
+ "EnableEncryption",
+ "EnableEncryptionFormat"
+ ],
+ "defaultValue": "EnableEncryption",
+ "type": "string"
+ },
+ "volumeType": {
+ "allowedValues": [
+ "OS",
+ "Data",
+ "All"
+ ],
+ "defaultValue": "All",
+ "type": "string"
+ },
+ "keyEncryptionKeyURL": {
+ "defaultValue": "${var.key_encryption_key_url}",
+ "type": "string"
+ },
+ "keyVaultName": {
+ "defaultValue": "${var.key_vault_name}",
+ "type": "string"
+ },
+ "keyVaultResourceGroup": {
+ "defaultValue": "${azurerm_resource_group.rg.name}",
+ "type": "string"
+ },
+ "passphrase": {
+ "defaultValue": "${var.passphrase}",
+ "type": "string"
+ },
+ "sequenceVersion": {
+ "defaultValue": 1,
+ "type": "string"
+ },
+ "useKek": {
+ "allowedValues": [
+ "nokek",
+ "kek"
+ ],
+ "defaultValue": "kek",
+ "type": "string"
+ },
+ "vmName": {
+ "defaultValue": "${azurerm_virtual_machine.vm.name}",
+ "type": "string"
+ },
+ "_artifactsLocation": {
+ "type": "string",
+ "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master"
+ },
+ "_artifactsLocationSasToken": {
+ "type": "string",
+ "defaultValue": ""
+ }
+ },
+ "variables": {
+ "extensionName": "AzureDiskEncryptionForLinux",
+ "extensionVersion": 0.1,
+ "keyEncryptionAlgorithm": "RSA-OAEP",
+ "keyVaultURL": "https://${var.key_vault_name}.vault.azure.net/",
+ "keyVaultResourceID": "${var.key_vault_resource_id}",
+ "updateVmUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-encrypt-running-linux-vm/updatevm-kek.json"
+ },
+ "resources": [
+ {
+ "type": "Microsoft.Compute/virtualMachines/extensions",
+ "name": [
+ [
+ "p",
+ "a",
+ "r",
+ "a",
+ "m",
+ "e",
+ "t",
+ "e",
+ "r",
+ "s",
+ "(",
+ "",
+ "v",
+ "m",
+ "N",
+ "a",
+ "m",
+ "e",
+ "",
+ ")",
+ "/",
+ "v",
+ "a",
+ "r",
+ "i",
+ "a",
+ "b",
+ "l",
+ "e",
+ "s",
+ "(",
+ "",
+ "e",
+ "x",
+ "t",
+ "e",
+ "n",
+ "s",
+ "i",
+ "o",
+ "n",
+ "N",
+ "a",
+ "m",
+ "e",
+ "",
+ ")"
+ ]
+ ],
+ "apiVersion": "2015-06-15",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "protectedSettings": {
+ "AADClientSecret": "[parameters('aadClientSecret')]",
+ "Passphrase": "[parameters('passphrase')]"
+ },
+ "publisher": "Microsoft.Azure.Security",
+ "settings": {
+ "AADClientID": "[parameters('aadClientID')]",
+ "DiskFormatQuery": "[parameters('diskFormatQuery')]",
+ "EncryptionOperation": "[parameters('encryptionOperation')]",
+ "KeyEncryptionAlgorithm": "[variables('keyEncryptionAlgorithm')]",
+ "KeyEncryptionKeyURL": "[parameters('keyEncryptionKeyURL')]",
+ "KeyVaultURL": "[variables('keyVaultURL')]",
+ "SequenceVersion": "[parameters('sequenceVersion')]",
+ "VolumeType": "[parameters('volumeType')]"
+ },
+ "type": "AzureDiskEncryptionForLinux",
+ "typeHandlerVersion": "[variables('extensionVersion')]"
+ }
+ },
+ {
+ "apiVersion": "2015-01-01",
+ "dependsOn": [
+ "[resourceId('Microsoft.Compute/virtualMachines/extensions', parameters('vmName'), variables('extensionName'))]"
+ ],
+ "name": [
+ [
+ "p",
+ "a",
+ "r",
+ "a",
+ "m",
+ "e",
+ "t",
+ "e",
+ "r",
+ "s",
+ "(",
+ "",
+ "v",
+ "m",
+ "N",
+ "a",
+ "m",
+ "e",
+ "",
+ ")",
+ "u",
+ "p",
+ "d",
+ "a",
+ "t",
+ "e",
+ "V",
+ "m"
+ ]
+ ],
+ "type": "Microsoft.Resources/deployments",
+ "properties": {
+ "mode": "Incremental",
+ "parameters": {
+ "keyEncryptionKeyURL": {
+ "value": "[parameters('keyEncryptionKeyURL')]"
+ },
+ "keyVaultResourceID": {
+ "value": "[variables('keyVaultResourceID')]"
+ },
+ "keyVaultSecretUrl": {
+ "value": "[reference(resourceId('Microsoft.Compute/virtualMachines/extensions', parameters('vmName'), variables('extensionName'))).instanceView.statuses[0].message]"
+ },
+ "vmName": {
+ "value": "[parameters('vmName')]"
+ }
+ },
+ "templateLink": {
+ "contentVersion": "1.0.0.0",
+ "uri": "[variables('updateVmUrl')]"
+ }
+ }
+ }
+ ],
+ "outputs": {
+ "BitLockerKey": {
+ "type": "string",
+ "value": "[reference(resourceId('Microsoft.Compute/virtualMachines/extensions', parameters('vmName'), variables('extensionName'))).instanceView.statuses[0].message]"
+ }
+ }
+ },
+ "compiletime_identity": "azurerm_template_deployment.linux_vm"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT133 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT133
new file mode 100644
index 0000000..19e4132
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT133
@@ -0,0 +1,99 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280055,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT133",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT133",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "testconfiguration1",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT134 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT134
new file mode 100644
index 0000000..25b242d
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT134
@@ -0,0 +1,111 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/main.tf"
+ ],
+ "timestamp": 1642943280058,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/attaching-external-disks/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT134",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine",
+ "azurerm_virtual_machine_data_disk_attachment",
+ "azurerm_managed_disk"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT134",
+ "collection": "terraformtemplate",
+ "json": {
+ "locals": [
+ {
+ "number_of_disks": 2
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "myosdisk1",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ },
+ {
+ "type": "azurerm_managed_disk",
+ "name": "external",
+ "properties": {
+ "count": "${local.number_of_disks}",
+ "name": "${var.prefix}-disk${count.index+1}",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "storage_account_type": "Standard_LRS",
+ "create_option": "Empty",
+ "disk_size_gb": 10,
+ "compiletime_identity": "azurerm_managed_disk.external"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_data_disk_attachment",
+ "name": "external",
+ "properties": {
+ "count": "${local.number_of_disks}",
+ "managed_disk_id": "${azurerm_managed_disk.external.*.id[count.index]}",
+ "virtual_machine_id": "${azurerm_virtual_machine.example.id}",
+ "lun": "${10+count.index}",
+ "caching": "ReadWrite",
+ "compiletime_identity": "azurerm_virtual_machine_data_disk_attachment.external"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT135 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT135
new file mode 100644
index 0000000..e807ee5
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT135
@@ -0,0 +1,90 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280060,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT135",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT135",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "testconfiguration1",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT136 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT136
new file mode 100644
index 0000000..8769b52
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT136
@@ -0,0 +1,88 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/main.tf"
+ ],
+ "timestamp": 1642943280063,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT136",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT136",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "delete_data_disks_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "myosdisk1",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT137 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT137
new file mode 100644
index 0000000..ef5566a
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT137
@@ -0,0 +1,90 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280067,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT137",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT137",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "testconfiguration1",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT138 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT138
new file mode 100644
index 0000000..ce11023
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT138
@@ -0,0 +1,92 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/main.tf"
+ ],
+ "timestamp": 1642943280070,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-custom-image/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT138",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT138",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "data": {
+ "azurerm_image": {
+ "custom": {
+ "name": "${var.custom_image_name}",
+ "resource_group_name": "${var.custom_image_resource_group_name}"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "id": "${data.azurerm_image.custom.id}"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "osdisk",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT139 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT139
new file mode 100644
index 0000000..91aebe1
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT139
@@ -0,0 +1,103 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280076,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT139",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT139",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "public_ip_address_allocation": "Dynamic",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT14 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT14
new file mode 100644
index 0000000..a891f1d
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT14
@@ -0,0 +1,117 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/windows-authentication/outputs.tf",
+ "/examples/app-service/windows-authentication/variables.tf",
+ "/examples/app-service/windows-authentication/main.tf"
+ ],
+ "timestamp": 1642943279610,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-authentication/outputs.tf",
+ "/examples/app-service/windows-authentication/variables.tf",
+ "/examples/app-service/windows-authentication/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT14",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT14",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "sku": [
+ {
+ "tier": "Basic",
+ "size": "B1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.main.id}",
+ "site_config": [
+ {
+ "dotnet_framework_version": "v4.0",
+ "remote_debugging_enabled": true,
+ "remote_debugging_version": "VS2019"
+ }
+ ],
+ "auth_settings": [
+ {
+ "enabled": true,
+ "issuer": "https://sts.windows.net/d13958f6-b541-4dad-97b9-5a39c6b01297",
+ "default_provider": "AzureActiveDirectory",
+ "unauthenticated_client_action": "RedirectToLoginPage",
+ "active_directory": [
+ {
+ "client_id": "aadclientid",
+ "client_secret": "aadsecret",
+ "allowed_audiences": [
+ "someallowedaudience"
+ ]
+ }
+ ],
+ "microsoft": [
+ {
+ "client_id": "microsoftclientid",
+ "client_secret": "microsoftclientsecret",
+ "oauth_scopes": [
+ "somescope"
+ ]
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT140 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT140
new file mode 100644
index 0000000..e5003a3
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT140
@@ -0,0 +1,98 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/main.tf"
+ ],
+ "timestamp": 1642943280085,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/from-marketplace-image/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT140",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT140",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "virtual_machine_name": "${var.prefix}-vm"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "storage_image_reference": [
+ {
+ "publisher": "radware",
+ "offer": "radware-alteon-va",
+ "sku": "radware-alteon-ng-va-adc",
+ "version": "latest"
+ }
+ ],
+ "plan": [
+ {
+ "name": "radware-alteon-ng-va-adc",
+ "publisher": "radware",
+ "product": "radware-alteon-va"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${local.virtual_machine_name}-osdisk",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT141 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT141
new file mode 100644
index 0000000..b743368
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT141
@@ -0,0 +1,74 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280090,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT141",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT141",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT142 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT142
new file mode 100644
index 0000000..3349163
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT142
@@ -0,0 +1,120 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/main.tf"
+ ],
+ "timestamp": 1642943280094,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/variables.tf",
+ "/examples/virtual-machines/virtual_machine/managed-disks/public-ip/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT142",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT142",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "testconfiguration1",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "myosdisk1",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT143 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT143
new file mode 100644
index 0000000..07b6cac
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT143
@@ -0,0 +1,231 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/multiple-network-interfaces/variables.tf",
+ "/examples/virtual-machines/virtual_machine/multiple-network-interfaces/main.tf"
+ ],
+ "timestamp": 1642943280101,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/multiple-network-interfaces/variables.tf",
+ "/examples/virtual-machines/virtual_machine/multiple-network-interfaces/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT143",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_security_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT143",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "virtual_machine_name": "${var.prefix}vm"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "172.16.0.0/16"
+ ],
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "external",
+ "properties": {
+ "name": "external",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "172.16.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.external"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "172.16.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Dynamic",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nsg",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "security_rule": [
+ {
+ "name": "allow_SSH",
+ "description": "Allow SSH access",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow_RDP",
+ "description": "Allow RDP access",
+ "priority": 110,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 3389,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "external",
+ "properties": {
+ "name": "${var.prefix}-ext-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_security_group_id": "${azurerm_network_security_group.example.id}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "subnet_id": "${azurerm_subnet.external.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.external"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "internal",
+ "properties": {
+ "name": "${var.prefix}-int-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.internal"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "primary_network_interface_id": "${azurerm_network_interface.external.id}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.external.id}",
+ "${azurerm_network_interface.internal.id}"
+ ],
+ "vm_size": "Standard_DS1_v2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${local.virtual_machine_name}-osdisk",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${local.virtual_machine_name}",
+ "admin_username": "myadmin",
+ "admin_password": "Passwword1234"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT144 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT144
new file mode 100644
index 0000000..1554705
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT144
@@ -0,0 +1,1021 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/openshift-origin/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/openshift-origin/variables.tf",
+ "/examples/virtual-machines/virtual_machine/openshift-origin/main.tf"
+ ],
+ "timestamp": 1642943280105,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/openshift-origin/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/openshift-origin/variables.tf",
+ "/examples/virtual-machines/virtual_machine/openshift-origin/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT144",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_network_security_group",
+ "azurerm_virtual_machine",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_storage_account",
+ "azurerm_lb_probe",
+ "azurerm_lb_nat_rule"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT144",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ],
+ "subscription_id": "${var.subscription_id}",
+ "client_id": "${var.aad_client_id}",
+ "client_secret": "${var.aad_client_secret}",
+ "tenant_id": "${var.tenant_id}"
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "rg",
+ "properties": {
+ "name": "${var.resource_group_name}",
+ "location": "southcentralus",
+ "compiletime_identity": "azurerm_resource_group.rg"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "primary_nsg",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}-primary-nsg",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "security_rule": [
+ {
+ "name": "allow_SSH_in_all",
+ "description": "Allow SSH in from all locations",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow_HTTPS_all",
+ "description": "Allow HTTPS connections from all locations",
+ "priority": 200,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 443,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow_OpenShift_console_in_all",
+ "description": "Allow OpenShift Console connections from all locations",
+ "priority": 300,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 8443,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.primary_nsg"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "infra_nsg",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}-infra-nsg",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "security_rule": [
+ {
+ "name": "allow_SSH_in_all",
+ "description": "Allow SSH in from all locations",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow_HTTPS_all",
+ "description": "Allow HTTPS connections from all locations",
+ "priority": 200,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 443,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow_HTTP_in_all",
+ "description": "Allow HTTP connections from all locations",
+ "priority": 300,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 80,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.infra_nsg"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "node_nsg",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}-node-nsg",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "security_rule": [
+ {
+ "name": "allow_SSH_in_all",
+ "description": "Allow SSH in from all locations",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow_HTTPS_all",
+ "description": "Allow HTTPS connections from all locations",
+ "priority": 200,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 443,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "allow_HTTP_in_all",
+ "description": "Allow HTTP connections from all locations",
+ "priority": 300,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 80,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.node_nsg"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "bastion_storage_account",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}bsa",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.bastion_storage_account"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "primary_storage_account",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}msa",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.primary_storage_account"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "infra_storage_account",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}infrasa",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.infra_storage_account"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "nodeos_storage_account",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}nodeossa",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.nodeos_storage_account"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "nodedata_storage_account",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}nodedatasa",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.nodedata_storage_account"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "registry_storage_account",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}regsa",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.registry_storage_account"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "persistent_volume_storage_account",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}pvsa",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.persistent_volume_storage_account"
+ }
+ },
+ {
+ "type": "azurerm_availability_set",
+ "name": "primary",
+ "properties": {
+ "name": "primaryavailabilityset",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "compiletime_identity": "azurerm_availability_set.primary"
+ }
+ },
+ {
+ "type": "azurerm_availability_set",
+ "name": "infra",
+ "properties": {
+ "name": "infraavailabilityset",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "compiletime_identity": "azurerm_availability_set.infra"
+ }
+ },
+ {
+ "type": "azurerm_availability_set",
+ "name": "node",
+ "properties": {
+ "name": "nodeavailabilityset",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "compiletime_identity": "azurerm_availability_set.node"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "bastion_pip",
+ "properties": {
+ "name": "bastionpip",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "allocation_method": "Static",
+ "domain_name_label": "${var.openshift_cluster_prefix}-bastion",
+ "compiletime_identity": "azurerm_public_ip.bastion_pip"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "openshift_primary_pip",
+ "properties": {
+ "name": "primarypip",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "allocation_method": "Static",
+ "domain_name_label": "${var.openshift_cluster_prefix}",
+ "compiletime_identity": "azurerm_public_ip.openshift_primary_pip"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "infra_lb_pip",
+ "properties": {
+ "name": "infraip",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "allocation_method": "Static",
+ "domain_name_label": "${var.openshift_cluster_prefix}infrapip",
+ "compiletime_identity": "azurerm_public_ip.infra_lb_pip"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "vnet",
+ "properties": {
+ "name": "openshiftvnet",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_space": [
+ "10.0.0.0/8"
+ ],
+ "depends_on": [
+ "azurerm_virtual_network.vnet"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.vnet"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "primary_subnet",
+ "properties": {
+ "name": "primarysubnet",
+ "virtual_network_name": "${azurerm_virtual_network.vnet.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.1.0.0/16"
+ ],
+ "depends_on": [
+ "azurerm_virtual_network.vnet"
+ ],
+ "compiletime_identity": "azurerm_subnet.primary_subnet"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "node_subnet",
+ "properties": {
+ "name": "nodesubnet",
+ "virtual_network_name": "${azurerm_virtual_network.vnet.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.2.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_subnet.node_subnet"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "primary_lb",
+ "properties": {
+ "name": "primaryloadbalancer",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "depends_on": [
+ "azurerm_public_ip.openshift_primary_pip"
+ ],
+ "frontend_ip_configuration": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "public_ip_address_id": "${azurerm_public_ip.openshift_primary_pip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.primary_lb"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "infra_lb",
+ "properties": {
+ "name": "infraloadbalancer",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "depends_on": [
+ "azurerm_public_ip.infra_lb_pip"
+ ],
+ "frontend_ip_configuration": [
+ {
+ "name": "LoadBalancerFrontEnd",
+ "public_ip_address_id": "${azurerm_public_ip.infra_lb_pip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.infra_lb"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "primary_lb",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "name": "loadBalancerBackEnd",
+ "loadbalancer_id": "${azurerm_lb.primary_lb.id}",
+ "depends_on": [
+ "azurerm_lb.primary_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_backend_address_pool.primary_lb"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "infra_lb",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "name": "loadBalancerBackEnd",
+ "loadbalancer_id": "${azurerm_lb.infra_lb.id}",
+ "depends_on": [
+ "azurerm_lb.infra_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_backend_address_pool.infra_lb"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "primary_lb",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.primary_lb.id}",
+ "name": "8443Probe",
+ "port": 8443,
+ "interval_in_seconds": 5,
+ "number_of_probes": 2,
+ "protocol": "Tcp",
+ "depends_on": [
+ "azurerm_lb.primary_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_probe.primary_lb"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "infra_lb_http_probe",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.infra_lb.id}",
+ "name": "httpProbe",
+ "port": 80,
+ "interval_in_seconds": 5,
+ "number_of_probes": 2,
+ "protocol": "Tcp",
+ "depends_on": [
+ "azurerm_lb.infra_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_probe.infra_lb_http_probe"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "infra_lb_https_probe",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.infra_lb.id}",
+ "name": "httpsProbe",
+ "port": 443,
+ "interval_in_seconds": 5,
+ "number_of_probes": 2,
+ "protocol": "Tcp",
+ "compiletime_identity": "azurerm_lb_probe.infra_lb_https_probe"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "primary_lb",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.primary_lb.id}",
+ "name": "OpenShiftAdminConsole",
+ "protocol": "Tcp",
+ "frontend_port": 8443,
+ "backend_port": 8443,
+ "frontend_ip_configuration_name": "LoadBalancerFrontEnd",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.primary_lb.id}",
+ "load_distribution": "SourceIP",
+ "idle_timeout_in_minutes": 30,
+ "probe_id": "${azurerm_lb_probe.primary_lb.id}",
+ "enable_floating_ip": false,
+ "depends_on": [
+ "azurerm_lb_probe.primary_lb",
+ "azurerm_lb.primary_lb",
+ "azurerm_lb_backend_address_pool.primary_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_rule.primary_lb"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "infra_lb_http",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.infra_lb.id}",
+ "name": "OpenShiftRouterHTTP",
+ "protocol": "Tcp",
+ "frontend_port": 80,
+ "backend_port": 80,
+ "frontend_ip_configuration_name": "LoadBalancerFrontEnd",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.infra_lb.id}",
+ "probe_id": "${azurerm_lb_probe.infra_lb_http_probe.id}",
+ "depends_on": [
+ "azurerm_lb_probe.infra_lb_http_probe",
+ "azurerm_lb.infra_lb",
+ "azurerm_lb_backend_address_pool.infra_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_rule.infra_lb_http"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "infra_lb_https",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.infra_lb.id}",
+ "name": "OpenShiftRouterHTTPS",
+ "protocol": "Tcp",
+ "frontend_port": 443,
+ "backend_port": 443,
+ "frontend_ip_configuration_name": "LoadBalancerFrontEnd",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.infra_lb.id}",
+ "probe_id": "${azurerm_lb_probe.infra_lb_https_probe.id}",
+ "depends_on": [
+ "azurerm_lb_probe.infra_lb_https_probe",
+ "azurerm_lb_backend_address_pool.infra_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_rule.infra_lb_https"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_rule",
+ "name": "primary_lb",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "loadbalancer_id": "${azurerm_lb.primary_lb.id}",
+ "name": "${azurerm_lb.primary_lb.name}-SSH-0",
+ "protocol": "Tcp",
+ "frontend_port": "${count.index + 2200}",
+ "backend_port": 22,
+ "frontend_ip_configuration_name": "LoadBalancerFrontEnd",
+ "depends_on": [
+ "azurerm_lb.primary_lb"
+ ],
+ "compiletime_identity": "azurerm_lb_nat_rule.primary_lb"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "bastion_nic",
+ "properties": {
+ "name": "bastionnic${count.index}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.primary_nsg.id}",
+ "ip_configuration": [
+ {
+ "name": "bastionip${count.index}",
+ "subnet_id": "${azurerm_subnet.primary_subnet.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.bastion_pip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.bastion_nic"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "primary_nic",
+ "properties": {
+ "name": "primarynic0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.primary_nsg.id}",
+ "ip_configuration": [
+ {
+ "name": "primaryip0",
+ "subnet_id": "${azurerm_subnet.primary_subnet.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "load_balancer_backend_address_pools_ids": [
+ "${azurerm_lb_backend_address_pool.primary_lb.id}"
+ ],
+ "load_balancer_inbound_nat_rules_ids": [
+ "element(azurerm_lb_nat_rule.primary_lb.*.id,0)"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.primary_nic"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "infra_nic",
+ "properties": {
+ "name": "infra_nic0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.infra_nsg.id}",
+ "ip_configuration": [
+ {
+ "name": "infraip0",
+ "subnet_id": "${azurerm_subnet.primary_subnet.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "load_balancer_backend_address_pools_ids": [
+ "${azurerm_lb_backend_address_pool.infra_lb.id}"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.infra_nic"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "node_nic",
+ "properties": {
+ "name": "node_nic0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.node_nsg.id}",
+ "ip_configuration": [
+ {
+ "name": "nodeip0",
+ "subnet_id": "${azurerm_subnet.node_subnet.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.node_nic"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "bastion",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}-bastion-1",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.bastion_nic.id}"
+ ],
+ "vm_size": "Standard_D2_v2",
+ "delete_os_disk_on_termination": true,
+ "delete_data_disks_on_termination": true,
+ "tags": {
+ "displayName": "${var.openshift_cluster_prefix}-bastion VM Creation"
+ },
+ "os_profile": [
+ {
+ "computer_name": "${var.openshift_cluster_prefix}-bastion-${count.index}",
+ "admin_username": "ocpadmin",
+ "admin_password": "${var.openshift_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": true,
+ "ssh_keys": [
+ {
+ "path": "/home/ocpadmin/.ssh/authorized_keys",
+ "key_data": "${var.ssh_public_key}"
+ }
+ ]
+ }
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "Openlogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.openshift_cluster_prefix}-primary-osdisk${count.index}",
+ "vhd_uri": "${azurerm_storage_account.bastion_storage_account.primary_blob_endpoint}vhds/${var.openshift_cluster_prefix}-bastion-osdisk.vhd",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "disk_size_gb": 60
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.bastion"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "primary",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}-primary-0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "availability_set_id": "${azurerm_availability_set.primary.id}",
+ "network_interface_ids": [
+ "element(azurerm_network_interface.primary_nic.*.id,0)"
+ ],
+ "vm_size": "Standard_DS4_v2",
+ "delete_os_disk_on_termination": true,
+ "delete_data_disks_on_termination": true,
+ "depends_on": [
+ "azurerm_virtual_machine.infra",
+ "azurerm_virtual_machine.node"
+ ],
+ "tags": {
+ "displayName": "${var.openshift_cluster_prefix}-primary VM Creation"
+ },
+ "connection": [
+ {
+ "host": "${azurerm_public_ip.openshift_primary_pip.fqdn}",
+ "user": "ocpadmin",
+ "port": 2200,
+ "private_key": "${file(var.connection_private_ssh_key_path)}"
+ }
+ ],
+ "provisioner": [
+ {
+ "file": {
+ "source": "${var.openshift_script_path}/primaryPrep.sh",
+ "destination": "primaryPrep.sh"
+ }
+ },
+ {
+ "file": {
+ "source": "${var.openshift_script_path}/deployOpenShift.sh",
+ "destination": "deployOpenShift.sh"
+ }
+ },
+ {
+ "remote-exec": {
+ "inline": [
+ "set -x",
+ "chmod +x primaryPrep.sh",
+ "chmod +x deployOpenShift.sh",
+ "sudo bash primaryPrep.sh \\\"${azurerm_storage_account.persistent_volume_storage_account.name}\\\" \\\"southcentralus\\\" \\\"ocpadmin\\\" && sudo bash deployOpenShift.sh \\\"ocpadmin\\\" \\\"${var.openshift_password}\\\" \\\"${var.key_vault_secret}\\\" \\\"${var.openshift_cluster_prefix}-primary\\\" \\\"${azurerm_public_ip.openshift_primary_pip.fqdn}\\\" \\\"${azurerm_public_ip.openshift_primary_pip.ip_address}\\\" \\\"${var.openshift_cluster_prefix}-infra\\\" \\\"${var.openshift_cluster_prefix}-node\\\" \\\"1\\\" \\\"1\\\" \\\"1\\\" \\\"xipio\\\" \\\"${azurerm_storage_account.registry_storage_account.name}\\\" \\\"${azurerm_storage_account.registry_storage_account.primary_access_key}\\\" \\\"${var.tenant_id}\\\" \\\"${var.subscription_id}\\\" \\\"${var.aad_client_id}\\\" \\\"${var.aad_client_secret}\\\" \\\"${azurerm_resource_group.rg.name}\\\" \\\"${azurerm_resource_group.rg.location}\\\" \\\"${var.key_vault_name}\\\""
+ ]
+ }
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.openshift_cluster_prefix}-primary-0",
+ "admin_username": "ocpadmin",
+ "admin_password": "${var.openshift_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": true,
+ "ssh_keys": [
+ {
+ "path": "/home/ocpadmin/.ssh/authorized_keys",
+ "key_data": "${var.ssh_public_key}"
+ }
+ ]
+ }
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "Openlogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.openshift_cluster_prefix}-primary-osdisk0",
+ "vhd_uri": "${azurerm_storage_account.primary_storage_account.primary_blob_endpoint}vhds/${var.openshift_cluster_prefix}-primary-osdisk0.vhd",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "disk_size_gb": 60
+ }
+ ],
+ "storage_data_disk": [
+ {
+ "name": "${var.openshift_cluster_prefix}-primary-docker-pool0",
+ "vhd_uri": "${azurerm_storage_account.primary_storage_account.primary_blob_endpoint}vhds/${var.openshift_cluster_prefix}-primary-docker-pool0.vhd",
+ "disk_size_gb": 128,
+ "create_option": "Empty",
+ "lun": 0
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.primary"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "infra",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}-infra-0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "availability_set_id": "${azurerm_availability_set.infra.id}",
+ "network_interface_ids": [
+ "element(azurerm_network_interface.infra_nic.*.id,0)"
+ ],
+ "vm_size": "Standard_DS3_v2",
+ "delete_os_disk_on_termination": true,
+ "delete_data_disks_on_termination": true,
+ "tags": {
+ "displayName": "${var.openshift_cluster_prefix}-infra VM Creation"
+ },
+ "connection": [
+ {
+ "type": "ssh",
+ "bastion_host": "${azurerm_public_ip.bastion_pip.fqdn}",
+ "bastion_user": "ocpadmin",
+ "bastion_private_key": "${file(var.connection_private_ssh_key_path)}",
+ "host": "element(azurerm_network_interface.infra_nic.*.private_ip_address,0)",
+ "user": "ocpadmin",
+ "private_key": "${file(var.connection_private_ssh_key_path)}"
+ }
+ ],
+ "provisioner": [
+ {
+ "file": {
+ "source": "${var.openshift_script_path}/nodePrep.sh",
+ "destination": "nodePrep.sh"
+ }
+ },
+ {
+ "remote-exec": {
+ "inline": [
+ "chmod +x nodePrep.sh",
+ "sudo bash nodePrep.sh"
+ ]
+ }
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.openshift_cluster_prefix}-infra-0",
+ "admin_username": "ocpadmin",
+ "admin_password": "${var.openshift_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": true,
+ "ssh_keys": [
+ {
+ "path": "/home/ocpadmin/.ssh/authorized_keys",
+ "key_data": "${var.ssh_public_key}"
+ }
+ ]
+ }
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "Openlogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.openshift_cluster_prefix}-infra-osdisk0",
+ "vhd_uri": "${azurerm_storage_account.infra_storage_account.primary_blob_endpoint}vhds/${var.openshift_cluster_prefix}-infra-osdisk0.vhd",
+ "caching": "ReadWrite",
+ "create_option": "FromImage"
+ }
+ ],
+ "storage_data_disk": [
+ {
+ "name": "${var.openshift_cluster_prefix}-infra-docker-pool",
+ "vhd_uri": "${azurerm_storage_account.infra_storage_account.primary_blob_endpoint}vhds/${var.openshift_cluster_prefix}-infra-docker-pool0.vhd",
+ "disk_size_gb": 128,
+ "create_option": "Empty",
+ "lun": 0
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.infra"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "node",
+ "properties": {
+ "name": "${var.openshift_cluster_prefix}-node-0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "availability_set_id": "${azurerm_availability_set.node.id}",
+ "network_interface_ids": [
+ "element(azurerm_network_interface.node_nic.*.id,0)"
+ ],
+ "vm_size": "Standard_DS3_v2",
+ "delete_os_disk_on_termination": true,
+ "delete_data_disks_on_termination": true,
+ "tags": {
+ "displayName": "${var.openshift_cluster_prefix}-node VM Creation"
+ },
+ "connection": [
+ {
+ "type": "ssh",
+ "bastion_host": "${azurerm_public_ip.bastion_pip.fqdn}",
+ "bastion_user": "ocpadmin",
+ "bastion_private_key": "${file(var.connection_private_ssh_key_path)}",
+ "host": "element(azurerm_network_interface.node_nic.*.private_ip_address,0)",
+ "user": "ocpadmin",
+ "private_key": "${file(var.connection_private_ssh_key_path)}"
+ }
+ ],
+ "provisioner": [
+ {
+ "file": {
+ "source": "${var.openshift_script_path}/nodePrep.sh",
+ "destination": "nodePrep.sh"
+ }
+ },
+ {
+ "remote-exec": {
+ "inline": [
+ "chmod +x nodePrep.sh",
+ "sudo bash nodePrep.sh"
+ ]
+ }
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.openshift_cluster_prefix}-node-0",
+ "admin_username": "ocpadmin",
+ "admin_password": "${var.openshift_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": true,
+ "ssh_keys": [
+ {
+ "path": "/home/ocpadmin/.ssh/authorized_keys",
+ "key_data": "${var.ssh_public_key}"
+ }
+ ]
+ }
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "Openlogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.openshift_cluster_prefix}-node-osdisk",
+ "vhd_uri": "${azurerm_storage_account.nodeos_storage_account.primary_blob_endpoint}vhds/${var.openshift_cluster_prefix}-node-osdisk0.vhd",
+ "caching": "ReadWrite",
+ "create_option": "FromImage"
+ }
+ ],
+ "storage_data_disk": [
+ {
+ "name": "${var.openshift_cluster_prefix}-node-docker-pool0",
+ "vhd_uri": "${azurerm_storage_account.nodeos_storage_account.primary_blob_endpoint}vhds/${var.openshift_cluster_prefix}-node-docker-pool0.vhd",
+ "disk_size_gb": 128,
+ "create_option": "Empty",
+ "lun": 0
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.node"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT145 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT145
new file mode 100644
index 0000000..1b8930a
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT145
@@ -0,0 +1,110 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280111,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT145",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT145",
+ "collection": "terraformtemplate",
+ "json": {
+ "locals": [
+ {
+ "virtual_machine_name": "${var.prefix}-vm",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-publicip",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "configuration",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT146 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT146
new file mode 100644
index 0000000..7e62966
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT146
@@ -0,0 +1,102 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/main.tf"
+ ],
+ "timestamp": 1642943280115,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/linux/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT146",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT146",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.prefix}-osdisk",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${local.virtual_machine_name}",
+ "admin_username": "${local.admin_username}",
+ "admin_password": "${local.admin_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "provisioner": [
+ {
+ "remote-exec": {
+ "connection": [
+ {
+ "user": "${local.admin_username}",
+ "password": "${local.admin_password}"
+ }
+ ],
+ "inline": [
+ "ls -la"
+ ]
+ }
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT147 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT147
new file mode 100644
index 0000000..783032e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT147
@@ -0,0 +1,110 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280119,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT147",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT147",
+ "collection": "terraformtemplate",
+ "json": {
+ "locals": [
+ {
+ "virtual_machine_name": "${var.prefix}-vm",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-publicip",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "configuration",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT148 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT148
new file mode 100644
index 0000000..ebb4093
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT148
@@ -0,0 +1,133 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/2-certificates.tf"
+ ],
+ "timestamp": 1642943280123,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/2-certificates.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT148",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT148",
+ "collection": "terraformtemplate",
+ "json": {
+ "data": {
+ "azurerm_client_config": {
+ "current": {
+ "compiletime_identity": "data.azurerm_client_config.current"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_key_vault",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}keyvault",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "enabled_for_deployment": true,
+ "enabled_for_template_deployment": true,
+ "sku_name": "standard",
+ "access_policy": [
+ {
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "object_id": "${data.azurerm_client_config.current.object_id}",
+ "certificate_permissions": [
+ "create",
+ "delete",
+ "get",
+ "update"
+ ],
+ "key_permissions": [],
+ "secret_permissions": []
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault.example"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "example",
+ "properties": {
+ "name": "${local.virtual_machine_name}-cert",
+ "key_vault_id": "${azurerm_key_vault.example.id}",
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Self"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": true
+ }
+ ],
+ "lifetime_action": [
+ {
+ "action": [
+ {
+ "action_type": "AutoRenew"
+ }
+ ],
+ "trigger": [
+ {
+ "days_before_expiry": 30
+ }
+ ]
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ],
+ "x509_certificate_properties": [
+ {
+ "extended_key_usage": [
+ "1.3.6.1.5.5.7.3.1"
+ ],
+ "key_usage": [
+ "cRLSign",
+ "dataEncipherment",
+ "digitalSignature",
+ "keyAgreement",
+ "keyCertSign",
+ "keyEncipherment"
+ ],
+ "subject": "CN=${local.virtual_machine_name}",
+ "validity_in_months": 12
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT149 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT149
new file mode 100644
index 0000000..72f73c0
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT149
@@ -0,0 +1,140 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/main.tf"
+ ],
+ "timestamp": 1642943280127,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/variables.tf",
+ "/examples/virtual-machines/virtual_machine/provisioners/windows/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT149",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT149",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "custom_data_params": "Param($ComputerName = \\\"${local.virtual_machine_name}\\\")",
+ "custom_data_content": "${local.custom_data_params} ${file(\"./files/winrm.ps1\")}"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.prefix}-osdisk",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${local.virtual_machine_name}",
+ "admin_username": "${local.admin_username}",
+ "admin_password": "${local.admin_password}",
+ "custom_data": "${local.custom_data_content}"
+ }
+ ],
+ "os_profile_secrets": [
+ {
+ "source_vault_id": "${azurerm_key_vault.example.id}",
+ "vault_certificates": [
+ {
+ "certificate_url": "${azurerm_key_vault_certificate.example.secret_id}",
+ "certificate_store": "My"
+ }
+ ]
+ }
+ ],
+ "os_profile_windows_config": [
+ {
+ "provision_vm_agent": true,
+ "enable_automatic_upgrades": true,
+ "additional_unattend_config": [
+ {
+ "pass": "oobeSystem",
+ "component": "Microsoft-Windows-Shell-Setup",
+ "setting_name": "AutoLogon",
+ "content": "${local.admin_password}true1${local.admin_username}"
+ },
+ {
+ "pass": "oobeSystem",
+ "component": "Microsoft-Windows-Shell-Setup",
+ "setting_name": "FirstLogonCommands",
+ "content": "${file(\"./files/FirstLogonCommands.xml\")}"
+ }
+ ]
+ }
+ ],
+ "provisioner": [
+ {
+ "remote-exec": {
+ "connection": [
+ {
+ "user": "${local.admin_username}",
+ "password": "${local.admin_password}",
+ "port": 5986,
+ "https": true,
+ "timeout": "10m",
+ "insecure": true
+ }
+ ],
+ "inline": [
+ "cd C:\\\\Windows",
+ "dir"
+ ]
+ }
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT15 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT15
new file mode 100644
index 0000000..0f5c58c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT15
@@ -0,0 +1,91 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/windows-basic/outputs.tf",
+ "/examples/app-service/windows-basic/variables.tf",
+ "/examples/app-service/windows-basic/main.tf"
+ ],
+ "timestamp": 1642943279612,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-basic/outputs.tf",
+ "/examples/app-service/windows-basic/variables.tf",
+ "/examples/app-service/windows-basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT15",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT15",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "sku": [
+ {
+ "tier": "Basic",
+ "size": "B1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.main.id}",
+ "site_config": [
+ {
+ "dotnet_framework_version": "v4.0",
+ "remote_debugging_enabled": true,
+ "remote_debugging_version": "VS2019"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT150 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT150
new file mode 100644
index 0000000..ec487c1
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT150
@@ -0,0 +1,722 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/variables.tf",
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/main.tf"
+ ],
+ "timestamp": 1642943280129,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/variables.tf",
+ "/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT150",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_availability_set",
+ "azurerm_network_interface",
+ "azurerm_network_security_group",
+ "azurerm_storage_container",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_storage_account"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT150",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "rg",
+ "properties": {
+ "name": "${var.resource_group}",
+ "location": "southcentralus",
+ "compiletime_identity": "azurerm_resource_group.rg"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "primary",
+ "properties": {
+ "name": "nsg-spark-primary",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "security_rule": [
+ {
+ "name": "ssh",
+ "description": "Allow SSH",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "Internet",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "http_webui_spark",
+ "description": "Allow Web UI Access to Spark",
+ "priority": 101,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 8080,
+ "source_address_prefix": "Internet",
+ "destination_address_prefix": "*"
+ },
+ {
+ "name": "http_rest_spark",
+ "description": "Allow REST API Access to Spark",
+ "priority": 102,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 6066,
+ "source_address_prefix": "Internet",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "secondary",
+ "properties": {
+ "name": "nsg-spark-secondary",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "security_rule": [
+ {
+ "name": "ssh",
+ "description": "Allow SSH",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "Internet",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "cassandra",
+ "properties": {
+ "name": "nsg-cassandra",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "security_rule": [
+ {
+ "name": "ssh",
+ "description": "Allow SSH",
+ "priority": 100,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "Internet",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_security_group.cassandra"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "spark",
+ "properties": {
+ "name": "vnet-spark",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.spark"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet1",
+ "properties": {
+ "name": "Subnet-Primary",
+ "virtual_network_name": "${azurerm_virtual_network.spark.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.0.0.0/24"
+ ],
+ "network_security_group_id": "${azurerm_network_security_group.primary.id}",
+ "depends_on": [
+ "azurerm_virtual_network.spark"
+ ],
+ "compiletime_identity": "azurerm_subnet.subnet1"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet2",
+ "properties": {
+ "name": "Subnet-Secondary",
+ "virtual_network_name": "${azurerm_virtual_network.spark.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.subnet2"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet3",
+ "properties": {
+ "name": "Subnet-Cassandra",
+ "virtual_network_name": "${azurerm_virtual_network.spark.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.subnet3"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "primary",
+ "properties": {
+ "name": "public-ip-primary",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.primary"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "secondary",
+ "properties": {
+ "name": "public-ip-secondary-0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.secondary"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "secondary",
+ "properties": {
+ "name": "public-ip-secondary-1",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.secondary"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "cassandra",
+ "properties": {
+ "name": "public-ip-cassandra",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.cassandra"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "primary",
+ "properties": {
+ "name": "nic-primary",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.primary.id}",
+ "depends_on": [
+ "azurerm_virtual_network.spark",
+ "azurerm_public_ip.primary",
+ "azurerm_network_security_group.primary"
+ ],
+ "ip_configuration": [
+ {
+ "name": "ipconfig1",
+ "subnet_id": "${azurerm_subnet.subnet1.id}",
+ "private_ip_address_allocation": "Static",
+ "private_ip_address": "10.0.0.5",
+ "public_ip_address_id": "${azurerm_public_ip.primary.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.primary"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "secondary",
+ "properties": {
+ "name": "nic-secondary-0",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.secondary.id}",
+ "depends_on": [
+ "azurerm_virtual_network.spark",
+ "azurerm_public_ip.secondary",
+ "azurerm_network_security_group.secondary"
+ ],
+ "ip_configuration": [
+ {
+ "name": "ipconfig1",
+ "subnet_id": "${azurerm_subnet.subnet2.id}",
+ "private_ip_address_allocation": "Static",
+ "private_ip_address": "10.0.1.${5 + count.index}",
+ "public_ip_address_id": "element(azurerm_public_ip.secondary.*.id,0)"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "secondary",
+ "properties": {
+ "name": "nic-secondary-1",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.secondary.id}",
+ "depends_on": [
+ "azurerm_virtual_network.spark",
+ "azurerm_public_ip.secondary",
+ "azurerm_network_security_group.secondary"
+ ],
+ "ip_configuration": [
+ {
+ "name": "ipconfig1",
+ "subnet_id": "${azurerm_subnet.subnet2.id}",
+ "private_ip_address_allocation": "Static",
+ "private_ip_address": "10.0.1.${5 + count.index}",
+ "public_ip_address_id": "element(azurerm_public_ip.secondary.*.id,1)"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.secondary"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "cassandra",
+ "properties": {
+ "name": "nic-cassandra",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "network_security_group_id": "${azurerm_network_security_group.cassandra.id}",
+ "depends_on": [
+ "azurerm_virtual_network.spark",
+ "azurerm_public_ip.cassandra",
+ "azurerm_network_security_group.cassandra"
+ ],
+ "ip_configuration": [
+ {
+ "name": "ipconfig1",
+ "subnet_id": "${azurerm_subnet.subnet3.id}",
+ "private_ip_address_allocation": "Static",
+ "private_ip_address": "10.0.2.5",
+ "public_ip_address_id": "${azurerm_public_ip.cassandra.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.cassandra"
+ }
+ },
+ {
+ "type": "azurerm_availability_set",
+ "name": "secondary",
+ "properties": {
+ "name": "availability-secondary",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "platform_update_domain_count": 5,
+ "platform_fault_domain_count": 2,
+ "compiletime_identity": "azurerm_availability_set.secondary"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "primary",
+ "properties": {
+ "name": "primary${var.unique_prefix}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.primary"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "secondary",
+ "properties": {
+ "name": "secondary${var.unique_prefix}0",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.secondary"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "secondary",
+ "properties": {
+ "name": "secondary${var.unique_prefix}1",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.secondary"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "cassandra",
+ "properties": {
+ "name": "cassandra${var.unique_prefix}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.cassandra"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "primary",
+ "properties": {
+ "name": "vhds",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "storage_account_name": "${azurerm_storage_account.primary.name}",
+ "container_access_type": "private",
+ "depends_on": [
+ "azurerm_storage_account.primary"
+ ],
+ "compiletime_identity": "azurerm_storage_container.primary"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "secondary",
+ "properties": {
+ "name": "vhds${count.index}",
+ "storage_account_name": "element(azurerm_storage_account.secondary.*.name,count.index)",
+ "container_access_type": "private",
+ "depends_on": [
+ "azurerm_storage_account.secondary"
+ ],
+ "compiletime_identity": "azurerm_storage_container.secondary"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "cassandra",
+ "properties": {
+ "name": "vhds",
+ "storage_account_name": "${azurerm_storage_account.cassandra.name}",
+ "container_access_type": "private",
+ "depends_on": [
+ "azurerm_storage_account.cassandra"
+ ],
+ "compiletime_identity": "azurerm_storage_container.cassandra"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "primary",
+ "properties": {
+ "name": "spark-primary",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "vm_size": "Standard_D1_v2",
+ "network_interface_ids": [
+ "${azurerm_network_interface.primary.id}"
+ ],
+ "depends_on": [
+ "azurerm_storage_account.primary",
+ "azurerm_network_interface.primary",
+ "azurerm_storage_container.primary"
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "vmPrimaryOSDisk",
+ "vhd_uri": "http://${azurerm_storage_account.primary.name}.blob.core.windows.net/${azurerm_storage_container.primary.name}/vmPrimaryOSDisk.vhd",
+ "create_option": "FromImage",
+ "caching": "ReadWrite"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "spark-primary",
+ "admin_username": "${var.vm_admin_username}",
+ "admin_password": "${var.vm_admin_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "connection": [
+ {
+ "type": "ssh",
+ "host": "${azurerm_public_ip.primary.ip_address}",
+ "user": "${var.vm_admin_username}",
+ "password": "${var.vm_admin_password}"
+ }
+ ],
+ "provisioner": [
+ {
+ "remote-exec": {
+ "inline": [
+ "wget https://raw.githubusercontent.com/Azure/azure-quickstart-templates/primary/spark-and-cassandra-on-centos/CustomScripts/scriptSparkProvisioner.sh",
+ "echo ${var.vm_admin_password} | sudo -S sh ./scriptSparkProvisioner.sh -runas=primary -primary=10.0.0.5"
+ ]
+ }
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.primary"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "secondary",
+ "properties": {
+ "name": "spark-secondary-0",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "vm_size": "Standard_D3_v2",
+ "network_interface_ids": [
+ "element(azurerm_network_interface.secondary.*.id,0)"
+ ],
+ "availability_set_id": "${azurerm_availability_set.secondary.id}",
+ "depends_on": [
+ "azurerm_storage_account.secondary",
+ "azurerm_network_interface.secondary",
+ "azurerm_storage_container.secondary"
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "vmSecondaryOSDisk-0",
+ "vhd_uri": "http://element(azurerm_storage_account.secondary.*.name,0).blob.core.windows.net/element(azurerm_storage_container.secondary.*.name,0)/vmSecondaryOSDisk-.vhd",
+ "create_option": "FromImage",
+ "caching": "ReadWrite"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "spark-secondary-0",
+ "admin_username": "${var.vm_admin_username}",
+ "admin_password": "${var.vm_admin_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "connection": [
+ {
+ "type": "ssh",
+ "host": "element(azurerm_public_ip.secondary.*.ip_address,0)",
+ "user": "${var.vm_admin_username}",
+ "password": "${var.vm_admin_password}"
+ }
+ ],
+ "provisioner": [
+ {
+ "remote-exec": {
+ "inline": [
+ "wget https://raw.githubusercontent.com/Azure/azure-quickstart-templates/primary/spark-and-cassandra-on-centos/CustomScripts/scriptSparkProvisioner.sh",
+ "echo ${var.vm_admin_password} | sudo -S sh ./scriptSparkProvisioner.sh -runas=secondary -primary=10.0.0.5"
+ ]
+ }
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.secondary"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "secondary",
+ "properties": {
+ "name": "spark-secondary-1",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "vm_size": "Standard_D3_v2",
+ "network_interface_ids": [
+ "element(azurerm_network_interface.secondary.*.id,1)"
+ ],
+ "availability_set_id": "${azurerm_availability_set.secondary.id}",
+ "depends_on": [
+ "azurerm_storage_account.secondary",
+ "azurerm_network_interface.secondary",
+ "azurerm_storage_container.secondary"
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "vmSecondaryOSDisk-1",
+ "vhd_uri": "http://element(azurerm_storage_account.secondary.*.name,1).blob.core.windows.net/element(azurerm_storage_container.secondary.*.name,1)/vmSecondaryOSDisk-.vhd",
+ "create_option": "FromImage",
+ "caching": "ReadWrite"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "spark-secondary-1",
+ "admin_username": "${var.vm_admin_username}",
+ "admin_password": "${var.vm_admin_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "connection": [
+ {
+ "type": "ssh",
+ "host": "element(azurerm_public_ip.secondary.*.ip_address,1)",
+ "user": "${var.vm_admin_username}",
+ "password": "${var.vm_admin_password}"
+ }
+ ],
+ "provisioner": [
+ {
+ "remote-exec": {
+ "inline": [
+ "wget https://raw.githubusercontent.com/Azure/azure-quickstart-templates/primary/spark-and-cassandra-on-centos/CustomScripts/scriptSparkProvisioner.sh",
+ "echo ${var.vm_admin_password} | sudo -S sh ./scriptSparkProvisioner.sh -runas=secondary -primary=10.0.0.5"
+ ]
+ }
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.secondary"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "cassandra",
+ "properties": {
+ "name": "cassandra",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "vm_size": "Standard_D3_v2",
+ "network_interface_ids": [
+ "${azurerm_network_interface.cassandra.id}"
+ ],
+ "depends_on": [
+ "azurerm_storage_account.cassandra",
+ "azurerm_network_interface.cassandra",
+ "azurerm_storage_container.cassandra"
+ ],
+ "storage_image_reference": [
+ {
+ "publisher": "OpenLogic",
+ "offer": "CentOS",
+ "sku": "7.3",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "vmCassandraOSDisk",
+ "vhd_uri": "http://${azurerm_storage_account.cassandra.name}.blob.core.windows.net/${azurerm_storage_container.cassandra.name}/vmCassandraOSDisk.vhd",
+ "create_option": "FromImage",
+ "caching": "ReadWrite"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "cassandra",
+ "admin_username": "${var.vm_admin_username}",
+ "admin_password": "${var.vm_admin_password}"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "connection": [
+ {
+ "type": "ssh",
+ "host": "${azurerm_public_ip.cassandra.ip_address}",
+ "user": "${var.vm_admin_username}",
+ "password": "${var.vm_admin_password}"
+ }
+ ],
+ "provisioner": [
+ {
+ "remote-exec": {
+ "inline": [
+ "wget https://raw.githubusercontent.com/Azure/azure-quickstart-templates/primary/spark-and-cassandra-on-centos/CustomScripts/scriptCassandraProvisioner.sh",
+ "echo ${var.vm_admin_password} | sudo -S sh ./scriptCassandraProvisioner.sh"
+ ]
+ }
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.cassandra"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT151 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT151
new file mode 100644
index 0000000..114e442
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT151
@@ -0,0 +1,123 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280135,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT151",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_storage_container",
+ "azurerm_storage_account"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT151",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "testconfiguration1",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}stor",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "example",
+ "properties": {
+ "name": "vhds",
+ "storage_account_name": "${azurerm_storage_account.example.name}",
+ "container_access_type": "private",
+ "compiletime_identity": "azurerm_storage_container.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT152 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT152
new file mode 100644
index 0000000..0787783
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT152
@@ -0,0 +1,93 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/main.tf"
+ ],
+ "timestamp": 1642943280139,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT152",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT152",
+ "collection": "terraformtemplate",
+ "json": {
+ "locals": [
+ {
+ "storage_account_base_uri": "${azurerm_storage_account.example.primary_blob_endpoint}${azurerm_storage_container.example.name}"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "delete_data_disks_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "osdisk",
+ "vhd_uri": "${local.storage_account_base_uri}/osdisk.vhd",
+ "caching": "ReadWrite",
+ "create_option": "FromImage"
+ }
+ ],
+ "storage_data_disk": [
+ {
+ "name": "datadisk1",
+ "vhd_uri": "${local.storage_account_base_uri}/datadisk1.vhd",
+ "disk_size_gb": 1023,
+ "create_option": "Empty",
+ "lun": 0
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "hostname",
+ "admin_username": "testadmin",
+ "admin_password": "Password1234!"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT153 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT153
new file mode 100644
index 0000000..51f8f39
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT153
@@ -0,0 +1,277 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/main.tf"
+ ],
+ "timestamp": 1642943280142,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/outputs.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/variables.tf",
+ "/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT153",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_storage_account",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT153",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "rg",
+ "properties": {
+ "name": "${var.resource_group}",
+ "location": "southcentralus",
+ "compiletime_identity": "azurerm_resource_group.rg"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "vnet",
+ "properties": {
+ "name": "${var.hostname}vnet",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.vnet"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "subnet",
+ "properties": {
+ "name": "${var.hostname}subnet",
+ "virtual_network_name": "${azurerm_virtual_network.vnet.name}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "address_prefixes": [
+ "10.0.0.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.subnet"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "transferpip",
+ "properties": {
+ "name": "transferpip",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.transferpip"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "mypip",
+ "properties": {
+ "name": "mypip",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "allocation_method": "Dynamic",
+ "compiletime_identity": "azurerm_public_ip.mypip"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "transfernic",
+ "properties": {
+ "name": "transfernic",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "ip_configuration": [
+ {
+ "name": "${azurerm_public_ip.transferpip.name}",
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "private_ip_address_allocation": "Static",
+ "public_ip_address_id": "${azurerm_public_ip.transferpip.id}",
+ "private_ip_address": "10.0.0.5"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.transfernic"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "mynic",
+ "properties": {
+ "name": "mynic",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "ip_configuration": [
+ {
+ "name": "${azurerm_public_ip.mypip.name}",
+ "subnet_id": "${azurerm_subnet.subnet.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.mypip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.mynic"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "existing",
+ "properties": {
+ "name": "${var.existing_storage_acct}",
+ "resource_group_name": "${var.existing_resource_group}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "lifecycle": {
+ "prevent_destroy": true
+ },
+ "compiletime_identity": "azurerm_storage_account.existing"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "stor",
+ "properties": {
+ "name": "${var.hostname}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "location": "${azurerm_resource_group.rg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.stor"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "transfer",
+ "properties": {
+ "name": "transfervm",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "vm_size": "Standard_DS1_v2",
+ "network_interface_ids": [
+ "${azurerm_network_interface.transfernic.id}"
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.hostname}-osdisk",
+ "image_uri": "${var.source_img_uri}",
+ "vhd_uri": "https://${var.existing_storage_acct}.blob.core.windows.net/${var.existing_resource_group}-vhds/${var.hostname}osdisk.vhd",
+ "os_type": "windows",
+ "caching": "ReadWrite",
+ "create_option": "FromImage"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.hostname}",
+ "admin_username": "vmadmin",
+ "admin_password": "${var.admin_password}"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.transfer"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "myvm",
+ "properties": {
+ "name": "myvm",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "vm_size": "Standard_DS1_v2",
+ "network_interface_ids": [
+ "${azurerm_network_interface.mynic.id}"
+ ],
+ "depends_on": [
+ "azurerm_virtual_machine_extension.execute"
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${var.hostname}osdisk",
+ "image_uri": "https://${azurerm_storage_account.stor.name}.blob.core.windows.net/vhds/${var.custom_image_name}.vhd",
+ "vhd_uri": "https://${var.hostname}.blob.core.windows.net/${var.hostname}-vhds/${var.hostname}osdisk.vhd",
+ "os_type": "windows",
+ "caching": "ReadWrite",
+ "create_option": "FromImage"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${var.hostname}",
+ "admin_username": "vmadmin",
+ "admin_password": "${var.admin_password}"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.myvm"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "script",
+ "properties": {
+ "name": "CustomScriptExtension",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "virtual_machine_name": "${azurerm_virtual_machine.transfer.name}",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.4,
+ "depends_on": [
+ "azurerm_virtual_machine.transfer"
+ ],
+ "settings": {
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -Command \"Invoke-WebRequest -Uri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-vm-custom-image-new-storage-account/ImageTransfer.ps1 -OutFile C:/ImageTransfer.ps1\" "
+ },
+ "compiletime_identity": "azurerm_virtual_machine_extension.script"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "execute",
+ "properties": {
+ "name": "CustomScriptExtension",
+ "location": "${azurerm_resource_group.rg.location}",
+ "resource_group_name": "${azurerm_resource_group.rg.name}",
+ "virtual_machine_name": "${azurerm_virtual_machine.transfer.name}",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.4,
+ "depends_on": [
+ "azurerm_virtual_machine_extension.script"
+ ],
+ "settings": " {\n \"commandToExecute\": \"powershell -ExecutionPolicy Unrestricted -File C:\\\\ImageTransfer.ps1 -SourceImage ${var.source_img_uri} -SourceSAKey ${azurerm_storage_account.existing.primary_access_key} -DestinationURI https://${azurerm_storage_account.stor.name}.blob.core.windows.net/vhds -DestinationSAKey ${azurerm_storage_account.stor.primary_access_key}\\\" \"\n }",
+ "compiletime_identity": "azurerm_virtual_machine_extension.execute"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT154 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT154
new file mode 100644
index 0000000..b847d07
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT154
@@ -0,0 +1,319 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/vm-joined-to-active-directory/variables.tf",
+ "/examples/virtual-machines/virtual_machine/vm-joined-to-active-directory/main.tf"
+ ],
+ "timestamp": 1642943280146,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/virtual_machine/vm-joined-to-active-directory/variables.tf",
+ "/examples/virtual-machines/virtual_machine/vm-joined-to-active-directory/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT154",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "null_resource",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT154",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "version": "=1.1.2"
+ }
+ }
+ ],
+ "locals": [
+ {
+ "resource_group_name": "${var.prefix}-resources"
+ }
+ ],
+ "output": [
+ {
+ "windows_client_public_ip": {
+ "value": "${module.windows-client.public_ip_address}"
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "dns_servers": [
+ "10.0.1.4",
+ "8.8.8.8"
+ ],
+ "prefix": "${var.prefix}",
+ "compiletime_identity": "module.network"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "domain-controllers",
+ "properties": {
+ "name": "domain-controllers",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "virtual_network_name": "${var.prefix}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "prefix": "${var.prefix}",
+ "location": "${azurerm_resource_group.test.location}",
+ "compiletime_identity": "module.network"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "domain-clients",
+ "properties": {
+ "name": "domain-clients",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "virtual_network_name": "${var.prefix}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "prefix": "${var.prefix}",
+ "location": "${azurerm_resource_group.test.location}",
+ "compiletime_identity": "module.network"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "primary",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "internal_dns_name_label": "${local.virtual_machine_name}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "subnet_id": "${module.network.domain_controllers_subnet_id}",
+ "private_ip_address_allocation": "Static",
+ "private_ip_address": "10.0.1.4"
+ }
+ ],
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_controllers_subnet_id}",
+ "active_directory_domain": "${var.prefix}.local",
+ "active_directory_netbios_name": "${var.prefix}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "compiletime_identity": "module.active-directory-domain"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "primary",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "internal_dns_name_label": "${local.virtual_machine_name}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "subnet_id": "${module.network.domain_clients_subnet_id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.static.id}"
+ }
+ ],
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_clients_subnet_id}",
+ "active_directory_domain": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "compiletime_identity": "module.windows-client"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "create-active-directory-forest",
+ "properties": {
+ "name": "create-active-directory-forest",
+ "location": "${azurerm_virtual_machine.domain-controller.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "virtual_machine_name": "${azurerm_virtual_machine.domain-controller.name}",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.9,
+ "settings": " {\n \"commandToExecute\": \"powershell.exe -Command \\\"${local.powershell_command}\\\"\"\n }",
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_controllers_subnet_id}",
+ "active_directory_domain": "${var.prefix}.local",
+ "active_directory_netbios_name": "${var.prefix}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "compiletime_identity": "module.active-directory-domain"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "join-domain",
+ "properties": {
+ "name": "${azurerm_virtual_machine.client.name}",
+ "location": "${azurerm_virtual_machine.client.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "virtual_machine_name": "${azurerm_virtual_machine.client.name}",
+ "publisher": "Microsoft.Compute",
+ "type": "JsonADDomainExtension",
+ "type_handler_version": 1.3,
+ "settings": {
+ "Name": "${var.prefix}.local",
+ "OUPath": "",
+ "User": "${var.prefix}.local${var.admin_username}",
+ "Restart": true,
+ "Options": 3
+ },
+ "protected_settings": {
+ "Password": "${var.admin_password}"
+ },
+ "depends_on": [
+ "null_resource.wait-for-domain-to-provision"
+ ],
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_clients_subnet_id}",
+ "active_directory_domain": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "compiletime_identity": "module.windows-client"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "static",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "allocation_method": "Static",
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_clients_subnet_id}",
+ "active_directory_domain": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "compiletime_identity": "module.windows-client"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "client",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.primary.id}"
+ ],
+ "vm_size": "Standard_F2",
+ "delete_os_disk_on_termination": true,
+ "storage_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "${local.virtual_machine_name}-disk1",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "${local.virtual_machine_name}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}"
+ }
+ ],
+ "os_profile_windows_config": [
+ {
+ "provision_vm_agent": true,
+ "enable_automatic_upgrades": true
+ }
+ ],
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_clients_subnet_id}",
+ "active_directory_domain": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "compiletime_identity": "module.windows-client"
+ }
+ },
+ {
+ "type": "null_resource",
+ "name": "wait-for-domain-to-provision",
+ "properties": {
+ "provisioner": [
+ {
+ "local-exec": {
+ "command": "sleep 720"
+ }
+ }
+ ],
+ "depends_on": [
+ "azurerm_virtual_machine.client"
+ ],
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "location": "${azurerm_resource_group.test.location}",
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_clients_subnet_id}",
+ "active_directory_domain": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "compiletime_identity": "module.windows-client"
+ }
+ },
+ {
+ "type": "azurerm_resource_group",
+ "name": "test",
+ "properties": {
+ "name": "${local.resource_group_name}",
+ "location": "West Europe",
+ "compiletime_identity": "azurerm_resource_group.test"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT155 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT155
new file mode 100644
index 0000000..f4e8e0e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT155
@@ -0,0 +1,130 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/windows/basic-password/variables.tf",
+ "/examples/virtual-machines/windows/basic-password/main.tf"
+ ],
+ "timestamp": 1642943280150,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/basic-password/variables.tf",
+ "/examples/virtual-machines/windows/basic-password/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT155",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT155",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT156 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT156
new file mode 100644
index 0000000..5128417
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT156
@@ -0,0 +1,131 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/windows/custom-data/variables.tf",
+ "/examples/virtual-machines/windows/custom-data/main.tf"
+ ],
+ "timestamp": 1642943280154,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/custom-data/variables.tf",
+ "/examples/virtual-machines/windows/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT156",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT156",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "custom_data": "base64encode(\"Hello World!\")",
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT157 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT157
new file mode 100644
index 0000000..c49bed4
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT157
@@ -0,0 +1,136 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/windows/ephemeral-os-disk/variables.tf",
+ "/examples/virtual-machines/windows/ephemeral-os-disk/main.tf"
+ ],
+ "timestamp": 1642943280158,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/ephemeral-os-disk/variables.tf",
+ "/examples/virtual-machines/windows/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT157",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT157",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "size": "Standard_DS3_v2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "custom_data": "base64encode(\"Hello World!\")",
+ "network_interface_ids": [
+ "${azurerm_network_interface.main.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite",
+ "diff_disk_settings": [
+ {
+ "option": "Local"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT158 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT158
new file mode 100644
index 0000000..d7f349c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT158
@@ -0,0 +1,149 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-custom-extension/vars.tf",
+ "/examples/virtual-machines/windows/vm-custom-extension/main.tf"
+ ],
+ "timestamp": 1642943280161,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-custom-extension/vars.tf",
+ "/examples/virtual-machines/windows/vm-custom-extension/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT158",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT158",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "example-resources",
+ "location": "West US",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "example-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "example-subnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "example-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "example-ip",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "example-vm",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "os_disk": [
+ {
+ "caching": "ReadWrite",
+ "storage_account_type": "Standard_LRS"
+ }
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "example",
+ "properties": {
+ "name": "ansible_windows_winrm",
+ "virtual_machine_id": "${azurerm_windows_virtual_machine.example.id}",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.9,
+ "settings": {
+ "fileUris": [
+ "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
+ ],
+ "commandToExecute": "powershell -ExecutionPolicy Unrestricted -file ConfigureRemotingForAnsible.ps1 -EnableCredSSP -DisableBasicAuth"
+ },
+ "compiletime_identity": "azurerm_virtual_machine_extension.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT159 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT159
new file mode 100644
index 0000000..37c2be3
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT159
@@ -0,0 +1,340 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-joined-to-active-directory/variables.tf",
+ "/examples/virtual-machines/windows/vm-joined-to-active-directory/main.tf"
+ ],
+ "timestamp": 1642943280165,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-joined-to-active-directory/variables.tf",
+ "/examples/virtual-machines/windows/vm-joined-to-active-directory/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT159",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_public_ip",
+ "azurerm_virtual_machine_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT159",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "location": "${var.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "dns_servers": [
+ "10.0.1.4",
+ "8.8.8.8"
+ ],
+ "prefix": "${var.prefix}",
+ "compiletime_identity": "module.network"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "domain-controllers",
+ "properties": {
+ "name": "domain-controllers",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${var.prefix}-network",
+ "location": "${var.location}",
+ "prefix": "${var.prefix}",
+ "compiletime_identity": "module.network"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "domain-members",
+ "properties": {
+ "name": "domain-members",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${var.prefix}-network",
+ "location": "${var.location}",
+ "prefix": "${var.prefix}",
+ "compiletime_identity": "module.network"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "dc_nic",
+ "properties": {
+ "name": "${var.prefix}-dc-primary",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "private_ip_address_allocation": "Static",
+ "private_ip_address": "10.0.1.4",
+ "subnet_id": "${module.network.domain_controllers_subnet_id}"
+ }
+ ],
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_netbios_name": "${var.prefix}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_controllers_subnet_id}",
+ "compiletime_identity": "module.active-directory-domain"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "primary",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "primary",
+ "subnet_id": "${module.network.domain_members_subnet_id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.static.id}"
+ }
+ ],
+ "prefix": "${var.prefix}",
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "subnet_id": "${module.network.domain_members_subnet_id}",
+ "compiletime_identity": "module.active-directory-member"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine",
+ "name": "domain-controller",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "size": "Standard_F2",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "custom_data": "${local.custom_data}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.dc_nic.id}"
+ ],
+ "os_disk": [
+ {
+ "caching": "ReadWrite",
+ "storage_account_type": "Standard_LRS"
+ }
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "additional_unattend_content": [
+ {
+ "content": "${local.auto_logon_data}",
+ "setting": "AutoLogon"
+ },
+ {
+ "content": "${local.first_logon_data}",
+ "setting": "FirstLogonCommands"
+ }
+ ],
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_netbios_name": "${var.prefix}",
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_controllers_subnet_id}",
+ "compiletime_identity": "module.active-directory-domain"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine",
+ "name": "domain-member",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "size": "Standard_F2",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "provision_vm_agent": true,
+ "enable_automatic_updates": true,
+ "network_interface_ids": [
+ "${azurerm_network_interface.primary.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "caching": "ReadWrite",
+ "storage_account_type": "Standard_LRS"
+ }
+ ],
+ "prefix": "${var.prefix}",
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "subnet_id": "${module.network.domain_members_subnet_id}",
+ "compiletime_identity": "module.active-directory-member"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "create-ad-forest",
+ "properties": {
+ "name": "create-active-directory-forest",
+ "virtual_machine_id": "${azurerm_windows_virtual_machine.domain-controller.id}",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.9,
+ "settings": " {\n \"commandToExecute\": \"powershell.exe -Command \\\"${local.powershell_command}\\\"\"\n }",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_netbios_name": "${var.prefix}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "prefix": "${var.prefix}",
+ "subnet_id": "${module.network.domain_controllers_subnet_id}",
+ "compiletime_identity": "module.active-directory-domain"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "wait-for-domain-to-provision",
+ "properties": {
+ "name": "TestConnectionDomain",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.9,
+ "virtual_machine_id": "${azurerm_windows_virtual_machine.domain-member.id}",
+ "settings": " {\n \"commandToExecute\": \"powershell.exe -Command \\\"while (!(Test-Connection -ComputerName ${var.prefix}.local -Count 1 -Quiet) -and ($retryCount++ -le 360)) { Start-Sleep 10 } \\\"\"\n }",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "prefix": "${var.prefix}",
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "subnet_id": "${module.network.domain_members_subnet_id}",
+ "compiletime_identity": "module.active-directory-member"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_extension",
+ "name": "join-domain",
+ "properties": {
+ "name": "${local.virtual_machine_name}",
+ "publisher": "Microsoft.Compute",
+ "type": "JsonADDomainExtension",
+ "type_handler_version": 1.3,
+ "virtual_machine_id": "${azurerm_windows_virtual_machine.domain-member.id}",
+ "settings": {
+ "Name": "${var.prefix}.local",
+ "OUPath": "",
+ "User": "${var.admin_username}@${var.prefix}.local",
+ "Restart": true,
+ "Options": 3
+ },
+ "protected_settings": {
+ "Password": "${var.admin_password}"
+ },
+ "depends_on": [
+ {
+ "name": "TestConnectionDomain",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.9,
+ "virtual_machine_id": "${azurerm_windows_virtual_machine.domain-member.id}",
+ "settings": " {\n \"commandToExecute\": \"powershell.exe -Command \\\"while (!(Test-Connection -ComputerName ${var.prefix}.local -Count 1 -Quiet) -and ($retryCount++ -le 360)) { Start-Sleep 10 } \\\"\"\n }"
+ }
+ ],
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "prefix": "${var.prefix}",
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "subnet_id": "${module.network.domain_members_subnet_id}",
+ "compiletime_identity": "module.active-directory-member"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "static",
+ "properties": {
+ "name": "${var.prefix}",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Static",
+ "prefix": "${var.prefix}",
+ "active_directory_domain_name": "${var.prefix}.local",
+ "active_directory_username": "${var.admin_username}",
+ "active_directory_password": "${var.admin_password}",
+ "admin_username": "${var.admin_username}",
+ "admin_password": "${var.admin_password}",
+ "subnet_id": "${module.network.domain_members_subnet_id}",
+ "compiletime_identity": "module.active-directory-member"
+ }
+ },
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "location": "${var.location}",
+ "name": "${var.prefix}-rg",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT16 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT16
new file mode 100644
index 0000000..87aaab7
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT16
@@ -0,0 +1,96 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/windows-container/outputs.tf",
+ "/examples/app-service/windows-container/variables.tf",
+ "/examples/app-service/windows-container/main.tf"
+ ],
+ "timestamp": 1642943279615,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-container/outputs.tf",
+ "/examples/app-service/windows-container/variables.tf",
+ "/examples/app-service/windows-container/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT16",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT16",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "kind": "xenon",
+ "is_xenon": true,
+ "sku": [
+ {
+ "tier": "PremiumV3",
+ "size": "P1V3"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.example.id}",
+ "site_config": [
+ {
+ "windows_fx_version": "DOCKER|mcr.microsoft.com/azure-app-service/samples/aspnethelloworld:latest"
+ }
+ ],
+ "app_settings": {
+ "DOCKER_REGISTRY_SERVER_URL": "https://mcr.microsoft.com",
+ "DOCKER_REGISTRY_SERVER_USERNAME": "",
+ "DOCKER_REGISTRY_SERVER_PASSWORD": ""
+ },
+ "compiletime_identity": "azurerm_app_service.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT160 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT160
new file mode 100644
index 0000000..283a69e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT160
@@ -0,0 +1,159 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-role-assignment/vars.tf",
+ "/examples/virtual-machines/windows/vm-role-assignment/main.tf"
+ ],
+ "timestamp": 1642943280170,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-machines/windows/vm-role-assignment/vars.tf",
+ "/examples/virtual-machines/windows/vm-role-assignment/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT160",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_role_assignment",
+ "azurerm_storage_account"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT160",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "example-resources",
+ "location": "West US",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "example-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "example-subnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "example-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "example-ip",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "example-vm",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "size": "Standard_F2",
+ "admin_username": "adminuser",
+ "admin_password": "P@$$w0rd1234!",
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "os_disk": [
+ {
+ "caching": "ReadWrite",
+ "storage_account_type": "Standard_LRS"
+ }
+ ],
+ "identity": [
+ {
+ "type": "SystemAssigned"
+ }
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2016-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine.example"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "example",
+ "properties": {
+ "name": "exampleblobname",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "GRS",
+ "compiletime_identity": "azurerm_storage_account.example"
+ }
+ },
+ {
+ "type": "azurerm_role_assignment",
+ "name": "example",
+ "properties": {
+ "scope": "${azurerm_storage_account.example.id}",
+ "role_definition_name": "Reader",
+ "principal_id": "${azurerm_windows_virtual_machine.example.identity[0].principal_id}",
+ "compiletime_identity": "azurerm_role_assignment.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT161 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT161
new file mode 100644
index 0000000..62a9bc0
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT161
@@ -0,0 +1,485 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/azure-firewall/variables.tf",
+ "/examples/virtual-networks/azure-firewall/main.tf"
+ ],
+ "timestamp": 1642943280173,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/azure-firewall/variables.tf",
+ "/examples/virtual-networks/azure-firewall/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT161",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "random_string",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_storage_account",
+ "azurerm_network_interface",
+ "azurerm_virtual_machine",
+ "azurerm_route_table",
+ "azurerm_public_ip",
+ "azurerm_subnet_route_table_association",
+ "azurerm_network_security_group",
+ "azurerm_network_interface_security_group_association",
+ "azurerm_firewall_network_rule_collection",
+ "azurerm_firewall",
+ "azurerm_firewall_application_rule_collection"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT161",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "azurg",
+ "properties": {
+ "name": "rgAzureFirewall",
+ "location": "East US",
+ "compiletime_identity": "azurerm_resource_group.azurg"
+ }
+ },
+ {
+ "type": "random_string",
+ "name": "azustring",
+ "properties": {
+ "length": 16,
+ "special": false,
+ "upper": false,
+ "number": false,
+ "compiletime_identity": "random_string.azustring"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "azusa",
+ "properties": {
+ "name": "${random_string.azustring.result}",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_storage_account.azusa"
+ }
+ },
+ {
+ "type": "azurerm_route_table",
+ "name": "azurt",
+ "properties": {
+ "name": "AzfwRouteTable",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "disable_bgp_route_propagation": false,
+ "route": [
+ {
+ "name": "AzfwDefaultRoute",
+ "address_prefix": "0.0.0.0/0",
+ "next_hop_type": "VirtualAppliance",
+ "next_hop_in_ip_address": "10.0.1.4"
+ }
+ ],
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_route_table.azurt"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "azuvnet",
+ "properties": {
+ "name": "virtualNetwork1",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "dns_servers": [
+ "168.63.129.16",
+ "8.8.8.8"
+ ],
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_virtual_network.azuvnet"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "azusubnetjb",
+ "properties": {
+ "name": "JumpboxSubnet",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "virtual_network_name": "${azurerm_virtual_network.azuvnet.name}",
+ "address_prefixes": [
+ "10.0.0.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.azusubnetjb"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "azusubnetfw",
+ "properties": {
+ "name": "AzureFirewallSubnet",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "virtual_network_name": "${azurerm_virtual_network.azuvnet.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.azusubnetfw"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "azusubnet",
+ "properties": {
+ "name": "ServersSubnet",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "virtual_network_name": "${azurerm_virtual_network.azuvnet.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.azusubnet"
+ }
+ },
+ {
+ "type": "azurerm_subnet_route_table_association",
+ "name": "azurtassoc",
+ "properties": {
+ "subnet_id": "${azurerm_subnet.azusubnet.id}",
+ "route_table_id": "${azurerm_route_table.azurt.id}",
+ "compiletime_identity": "azurerm_subnet_route_table_association.azurtassoc"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "azufwpip",
+ "properties": {
+ "name": "azureFirewalls-ip",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "allocation_method": "Static",
+ "sku": "Standard",
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_public_ip.azufwpip"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "azujumppip",
+ "properties": {
+ "name": "jumpBox-ip",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "allocation_method": "Dynamic",
+ "sku": "Basic",
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_public_ip.azujumppip"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "azunsgjb",
+ "properties": {
+ "name": "JumpHostNSG",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "security_rule": [
+ {
+ "name": "RDP",
+ "priority": 1000,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*"
+ }
+ ],
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_network_security_group.azunsgjb"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "azunicjb",
+ "properties": {
+ "name": "JumpHostNIC",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "ip_configuration": [
+ {
+ "name": "ipconfig1",
+ "subnet_id": "${azurerm_subnet.azusubnetjb.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.azujumppip.id}"
+ }
+ ],
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_network_interface.azunicjb"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "azunicvm",
+ "properties": {
+ "name": "ServerNIC",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "ip_configuration": [
+ {
+ "name": "ipconfig1",
+ "subnet_id": "${azurerm_subnet.azusubnet.id}",
+ "private_ip_address_allocation": "Dynamic"
+ }
+ ],
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_network_interface.azunicvm"
+ }
+ },
+ {
+ "type": "azurerm_network_interface_security_group_association",
+ "name": "azunicjb",
+ "properties": {
+ "network_interface_id": "${azurerm_network_interface.azunicjb.id}",
+ "network_security_group_id": "${azurerm_network_security_group.azunsgjb.id}",
+ "compiletime_identity": "azurerm_network_interface_security_group_association.azunicjb"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "vmjb",
+ "properties": {
+ "name": "JumpBox",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.azunicjb.id}"
+ ],
+ "vm_size": "Standard_DS1_v2",
+ "storage_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "JumpBox-OSDisk",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "JumpBox",
+ "admin_username": "${var.adminUsername}",
+ "admin_password": "${var.adminPassword}"
+ }
+ ],
+ "os_profile_windows_config": [
+ {}
+ ],
+ "boot_diagnostics": [
+ {
+ "enabled": true,
+ "storage_uri": "${azurerm_storage_account.azusa.primary_blob_endpoint}"
+ }
+ ],
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "depends_on": [
+ "${azurerm_network_interface_security_group_association.azunicjb}"
+ ],
+ "compiletime_identity": "azurerm_virtual_machine.vmjb"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine",
+ "name": "vmserver",
+ "properties": {
+ "name": "Server",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "network_interface_ids": [
+ "${azurerm_network_interface.azunicvm.id}"
+ ],
+ "vm_size": "Standard_DS1_v2",
+ "storage_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2012-R2-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "storage_os_disk": [
+ {
+ "name": "Server-OSDisk",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name": "Server",
+ "admin_username": "${var.adminUsername}",
+ "admin_password": "${var.adminPassword}"
+ }
+ ],
+ "os_profile_windows_config": [
+ {}
+ ],
+ "boot_diagnostics": [
+ {
+ "enabled": true,
+ "storage_uri": "${azurerm_storage_account.azusa.primary_blob_endpoint}"
+ }
+ ],
+ "tags": {
+ "environment": "Staging",
+ "owner": "Someone@contoso.com",
+ "costcenter": "IT"
+ },
+ "compiletime_identity": "azurerm_virtual_machine.vmserver"
+ }
+ },
+ {
+ "type": "azurerm_firewall",
+ "name": "azufw",
+ "properties": {
+ "name": "firewall1",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "location": "${azurerm_resource_group.azurg.location}",
+ "ip_configuration": [
+ {
+ "name": "configuration",
+ "subnet_id": "${azurerm_subnet.azusubnetfw.id}",
+ "public_ip_address_id": "${azurerm_public_ip.azufwpip.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_firewall.azufw"
+ }
+ },
+ {
+ "type": "azurerm_firewall_application_rule_collection",
+ "name": "azufwappr1",
+ "properties": {
+ "name": "appRc1",
+ "azure_firewall_name": "${azurerm_firewall.azufw.name}",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "priority": 101,
+ "action": "Allow",
+ "rule": [
+ {
+ "name": "appRule1",
+ "source_addresses": [
+ "10.0.0.0/24"
+ ],
+ "target_fqdns": [
+ "www.microsoft.com"
+ ],
+ "protocol": [
+ {
+ "port": 80,
+ "type": "Http"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_firewall_application_rule_collection.azufwappr1"
+ }
+ },
+ {
+ "type": "azurerm_firewall_network_rule_collection",
+ "name": "azufwnetr1",
+ "properties": {
+ "name": "testcollection",
+ "azure_firewall_name": "${azurerm_firewall.azufw.name}",
+ "resource_group_name": "${azurerm_resource_group.azurg.name}",
+ "priority": 200,
+ "action": "Allow",
+ "rule": [
+ {
+ "name": "netRc1",
+ "source_addresses": [
+ "10.0.0.0/24"
+ ],
+ "destination_ports": [
+ "8000-8999"
+ ],
+ "destination_addresses": [
+ "*"
+ ],
+ "protocols": [
+ "TCP"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_firewall_network_rule_collection.azufwnetr1"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT162 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT162
new file mode 100644
index 0000000..7e44c66
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT162
@@ -0,0 +1,81 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/basic/variables.tf",
+ "/examples/virtual-networks/basic/main.tf"
+ ],
+ "timestamp": 1642943280177,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/basic/variables.tf",
+ "/examples/virtual-networks/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT162",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT162",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT163 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT163
new file mode 100644
index 0000000..500f930
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT163
@@ -0,0 +1,107 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/multiple-subnets/variables.tf",
+ "/examples/virtual-networks/multiple-subnets/main.tf"
+ ],
+ "timestamp": 1642943280181,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/multiple-subnets/variables.tf",
+ "/examples/virtual-networks/multiple-subnets/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT163",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT163",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "frontend",
+ "properties": {
+ "name": "frontend",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.frontend"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "backend",
+ "properties": {
+ "name": "backend",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.backend"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "database",
+ "properties": {
+ "name": "database",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.3.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.database"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT164 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT164
new file mode 100644
index 0000000..6cf048d
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT164
@@ -0,0 +1,200 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/network-interface-app-security-group-association/variables.tf",
+ "/examples/virtual-networks/network-interface-app-security-group-association/main.tf"
+ ],
+ "timestamp": 1642943280184,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/network-interface-app-security-group-association/variables.tf",
+ "/examples/virtual-networks/network-interface-app-security-group-association/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT164",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_interface",
+ "azurerm_application_security_group",
+ "azurerm_linux_virtual_machine",
+ "azurerm_public_ip",
+ "azurerm_network_interface_application_security_group_association",
+ "azurerm_network_security_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT164",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_application_security_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-appsg",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_application_security_group.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nic",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "ip_configuration": [
+ {
+ "name": "testconfig-ip",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_network_interface.example"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vm",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "size": "Standard_B1s",
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "network_interface_ids": [
+ "${azurerm_network_interface.example.id}"
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine.example"
+ }
+ },
+ {
+ "type": "azurerm_network_interface_application_security_group_association",
+ "name": "example",
+ "properties": {
+ "network_interface_id": "${azurerm_network_interface.example.id}",
+ "application_security_group_id": "${azurerm_application_security_group.example.id}",
+ "depends_on": [
+ "${azurerm_linux_virtual_machine.example}"
+ ],
+ "compiletime_identity": "azurerm_network_interface_application_security_group_association.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nsg",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_network_security_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vnet",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_space": [
+ "10.0.0.0/8"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-subnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nsgrule",
+ "priority": 230,
+ "direction": "Inbound",
+ "access": "Deny",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "Internet",
+ "destination_application_security_group_ids": [
+ "${azurerm_application_security_group.example.id}"
+ ],
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_security_group_name": "${azurerm_network_security_group.example.name}",
+ "compiletime_identity": "azurerm_network_security_rule.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT165 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT165
new file mode 100644
index 0000000..22d8be6
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT165
@@ -0,0 +1,111 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/network-security-group/variables.tf",
+ "/examples/virtual-networks/network-security-group/main.tf"
+ ],
+ "timestamp": 1642943280187,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/network-security-group/variables.tf",
+ "/examples/virtual-networks/network-security-group/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT165",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_network_security_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT165",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nsg",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "compiletime_identity": "azurerm_network_security_group.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "ssh",
+ "properties": {
+ "name": "ssh",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "network_security_group_name": "${azurerm_network_security_group.example.name}",
+ "priority": 102,
+ "direction": "Inbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": 22,
+ "source_address_prefix": "*",
+ "destination_address_prefix": "*",
+ "compiletime_identity": "azurerm_network_security_rule.ssh"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT166 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT166
new file mode 100644
index 0000000..8965024
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT166
@@ -0,0 +1,83 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/network-security-group-rule/variables.tf",
+ "/examples/virtual-networks/network-security-group-rule/main.tf"
+ ],
+ "timestamp": 1642943280192,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/network-security-group-rule/variables.tf",
+ "/examples/virtual-networks/network-security-group-rule/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT166",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_network_security_rule",
+ "azurerm_network_security_group",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT166",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nsg",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_network_security_group.example"
+ }
+ },
+ {
+ "type": "azurerm_network_security_rule",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-nsgrule",
+ "network_security_group_name": "${azurerm_network_security_group.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "priority": 100,
+ "direction": "Outbound",
+ "access": "Allow",
+ "protocol": "Tcp",
+ "source_port_range": "*",
+ "destination_port_range": "*",
+ "source_address_prefix": "*",
+ "destination_address_prefix": "Sql.WestEurope",
+ "compiletime_identity": "azurerm_network_security_rule.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT167 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT167
new file mode 100644
index 0000000..de6206c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT167
@@ -0,0 +1,138 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/private-link-service/variables.tf",
+ "/examples/virtual-networks/private-link-service/main.tf"
+ ],
+ "timestamp": 1642943280195,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/private-link-service/variables.tf",
+ "/examples/virtual-networks/private-link-service/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT167",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_private_link_service",
+ "azurerm_public_ip",
+ "azurerm_lb"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT167",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "test",
+ "properties": {
+ "name": "example-private-link-service",
+ "location": "WestUS",
+ "compiletime_identity": "azurerm_resource_group.test"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "test",
+ "properties": {
+ "name": "acctestvnet",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "location": "${azurerm_resource_group.test.location}",
+ "address_space": [
+ "10.5.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.test"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "test",
+ "properties": {
+ "name": "acctestsnet",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "virtual_network_name": "${azurerm_virtual_network.test.name}",
+ "address_prefixes": [
+ "10.5.1.0/24"
+ ],
+ "enforce_private_link_service_network_policies": true,
+ "compiletime_identity": "azurerm_subnet.test"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "test",
+ "properties": {
+ "name": "acctestpip",
+ "sku": "Standard",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.test"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "test",
+ "properties": {
+ "name": "acctestlb",
+ "sku": "Standard",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "${azurerm_public_ip.test.name}",
+ "public_ip_address_id": "${azurerm_public_ip.test.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.test"
+ }
+ },
+ {
+ "type": "azurerm_private_link_service",
+ "name": "test",
+ "properties": {
+ "name": "acctestpls",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "nat_ip_configuration": [
+ {
+ "name": "${azurerm_public_ip.test.name}",
+ "subnet_id": "${azurerm_subnet.test.id}",
+ "private_ip_address": "10.5.1.17",
+ "primary": true
+ }
+ ],
+ "load_balancer_frontend_ip_configuration_ids": [
+ "${azurerm_lb.test.frontend_ip_configuration[0].id}"
+ ],
+ "tags": {
+ "env": "test"
+ },
+ "compiletime_identity": "azurerm_private_link_service.test"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT168 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT168
new file mode 100644
index 0000000..e96ad62
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT168
@@ -0,0 +1,77 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/virtual-hub/variables.tf",
+ "/examples/virtual-networks/virtual-hub/main.tf"
+ ],
+ "timestamp": 1642943280198,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-hub/variables.tf",
+ "/examples/virtual-networks/virtual-hub/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT168",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_hub",
+ "azurerm_virtual_wan",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT168",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_wan",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-virtualwan",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "compiletime_identity": "azurerm_virtual_wan.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_hub",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-virtualhub",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_prefix": "10.0.1.0/24",
+ "virtual_wan_id": "${azurerm_virtual_wan.example.id}",
+ "compiletime_identity": "azurerm_virtual_hub.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT169 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT169
new file mode 100644
index 0000000..e07753d
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT169
@@ -0,0 +1,113 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-gateway/basic/variables.tf",
+ "/examples/virtual-networks/virtual-network-gateway/basic/main.tf"
+ ],
+ "timestamp": 1642943280202,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-gateway/basic/variables.tf",
+ "/examples/virtual-networks/virtual-network-gateway/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT169",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_virtual_network_gateway",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT169",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vnet",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "GatewaySubnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefix": "10.0.1.0/24",
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Dynamic",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_gateway",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vnetgw",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "type": "Vpn",
+ "vpn_type": "PolicyBased",
+ "sku": "Basic",
+ "ip_configuration": [
+ {
+ "name": "vnetGatewayConfig",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "subnet_id": "${azurerm_subnet.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_network_gateway.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT17 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT17
new file mode 100644
index 0000000..9c792c5
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT17
@@ -0,0 +1,91 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/windows-java/outputs.tf",
+ "/examples/app-service/windows-java/variables.tf",
+ "/examples/app-service/windows-java/main.tf"
+ ],
+ "timestamp": 1642943279618,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/windows-java/outputs.tf",
+ "/examples/app-service/windows-java/variables.tf",
+ "/examples/app-service/windows-java/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT17",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_plan",
+ "azurerm_app_service",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT17",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-asp",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "sku": [
+ {
+ "tier": "Basic",
+ "size": "B1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.main"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.main.id}",
+ "site_config": [
+ {
+ "java_version": 1.8,
+ "java_container": "JETTY",
+ "java_container_version": 9.3
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT170 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT170
new file mode 100644
index 0000000..adc336b
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT170
@@ -0,0 +1,114 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-gateway/vpngw1/variables.tf",
+ "/examples/virtual-networks/virtual-network-gateway/vpngw1/main.tf"
+ ],
+ "timestamp": 1642943280205,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-gateway/vpngw1/variables.tf",
+ "/examples/virtual-networks/virtual-network-gateway/vpngw1/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT170",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_virtual_network_gateway",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT170",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vnet",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "GatewaySubnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefix": "10.0.1.0/24",
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Static",
+ "sku": "Standard",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_gateway",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vnetgw",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "type": "Vpn",
+ "vpn_type": "RouteBased",
+ "sku": "VpnGw1",
+ "ip_configuration": [
+ {
+ "name": "vnetGatewayConfig",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}",
+ "private_ip_address_allocation": "Dynamic",
+ "subnet_id": "${azurerm_subnet.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_network_gateway.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT171 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT171
new file mode 100644
index 0000000..8980cb1
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT171
@@ -0,0 +1,122 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-peering/variables.tf",
+ "/examples/virtual-networks/virtual-network-peering/main.tf"
+ ],
+ "timestamp": 1642943280208,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/virtual-networks/virtual-network-peering/variables.tf",
+ "/examples/virtual-networks/virtual-network-peering/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT171",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_virtual_network_peering"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT171",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "first",
+ "properties": {
+ "name": "${var.prefix}-network1",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/24"
+ ],
+ "subnet": [
+ {
+ "name": "subnet1",
+ "address_prefix": "10.0.0.0/24"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_network.first"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "second",
+ "properties": {
+ "name": "${var.prefix}-network2",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "192.168.0.0/24"
+ ],
+ "subnet": [
+ {
+ "name": "subnet1",
+ "address_prefix": "192.168.0.0/24"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_network.second"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_peering",
+ "name": "first-to-second",
+ "properties": {
+ "name": "first-to-second",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.first.name}",
+ "remote_virtual_network_id": "${azurerm_virtual_network.second.id}",
+ "allow_virtual_network_access": true,
+ "allow_forwarded_traffic": false,
+ "allow_gateway_transit": false,
+ "compiletime_identity": "azurerm_virtual_network_peering.first-to-second"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network_peering",
+ "name": "second-to-first",
+ "properties": {
+ "name": "second-to-first",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.second.name}",
+ "remote_virtual_network_id": "${azurerm_virtual_network.first.id}",
+ "allow_virtual_network_access": true,
+ "allow_forwarded_traffic": false,
+ "allow_gateway_transit": false,
+ "use_remote_gateways": false,
+ "compiletime_identity": "azurerm_virtual_network_peering.second-to-first"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT172 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT172
new file mode 100644
index 0000000..9fe61de
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT172
@@ -0,0 +1,138 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/extensions/custom-script/variables.tf",
+ "/examples/vm-scale-set/extensions/custom-script/main.tf"
+ ],
+ "timestamp": 1642943280212,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/extensions/custom-script/variables.tf",
+ "/examples/vm-scale-set/extensions/custom-script/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT172",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine_scale_set_extension",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT172",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_scale_set_extension",
+ "name": "custom-script",
+ "properties": {
+ "name": "custom-script",
+ "virtual_machine_scale_set_id": "${azurerm_linux_virtual_machine_scale_set.main.id}",
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "type_handler_version": 2.0,
+ "settings": "jsonencode({'commandToExecute': 'ls -la')}",
+ "compiletime_identity": "azurerm_virtual_machine_scale_set_extension.custom-script"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT173 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT173
new file mode 100644
index 0000000..15b1cf3
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT173
@@ -0,0 +1,201 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/auto-scaling/variables.tf",
+ "/examples/vm-scale-set/linux/auto-scaling/main.tf"
+ ],
+ "timestamp": 1642943280216,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/auto-scaling/variables.tf",
+ "/examples/vm-scale-set/linux/auto-scaling/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT173",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_monitor_autoscale_setting"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT173",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "lifecycle": [
+ {
+ "ignore_changes": [
+ "instances"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ },
+ {
+ "type": "azurerm_monitor_autoscale_setting",
+ "name": "main",
+ "properties": {
+ "name": "autoscale-config",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "target_resource_id": "${azurerm_linux_virtual_machine_scale_set.main.id}",
+ "profile": [
+ {
+ "name": "AutoScale",
+ "capacity": [
+ {
+ "default": 3,
+ "minimum": 1,
+ "maximum": 5
+ }
+ ],
+ "rule": [
+ {
+ "metric_trigger": [
+ {
+ "metric_name": "Percentage CPU",
+ "metric_resource_id": "${azurerm_linux_virtual_machine_scale_set.main.id}",
+ "time_grain": "PT1M",
+ "statistic": "Average",
+ "time_window": "PT5M",
+ "time_aggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 75
+ }
+ ],
+ "scale_action": [
+ {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": 1,
+ "cooldown": "PT1M"
+ }
+ ]
+ },
+ {
+ "metric_trigger": [
+ {
+ "metric_name": "Percentage CPU",
+ "metric_resource_id": "${azurerm_linux_virtual_machine_scale_set.main.id}",
+ "time_grain": "PT1M",
+ "statistic": "Average",
+ "time_window": "PT5M",
+ "time_aggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 25
+ }
+ ],
+ "scale_action": [
+ {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": 1,
+ "cooldown": "PT1M"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_autoscale_setting.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT174 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT174
new file mode 100644
index 0000000..0b289ee
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT174
@@ -0,0 +1,124 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/basic/variables.tf",
+ "/examples/vm-scale-set/linux/basic/main.tf"
+ ],
+ "timestamp": 1642943280219,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/basic/variables.tf",
+ "/examples/vm-scale-set/linux/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT174",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT174",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT175 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT175
new file mode 100644
index 0000000..b110b06
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT175
@@ -0,0 +1,142 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/boot-diagnostics/variables.tf",
+ "/examples/vm-scale-set/linux/boot-diagnostics/main.tf"
+ ],
+ "timestamp": 1642943280224,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/boot-diagnostics/variables.tf",
+ "/examples/vm-scale-set/linux/boot-diagnostics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT175",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_storage_account"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT175",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}stor",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "boot_diagnostics": [
+ {
+ "storage_account_uri": "${azurerm_storage_account.main.primary_blob_endpoint}"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT176 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT176
new file mode 100644
index 0000000..4a4984c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT176
@@ -0,0 +1,125 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/custom-data/variables.tf",
+ "/examples/vm-scale-set/linux/custom-data/main.tf"
+ ],
+ "timestamp": 1642943280230,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/custom-data/variables.tf",
+ "/examples/vm-scale-set/linux/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT176",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT176",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "custom_data": "base64encode(\"example custom data\")",
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT177 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT177
new file mode 100644
index 0000000..6579433
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT177
@@ -0,0 +1,132 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/data-disks/variables.tf",
+ "/examples/vm-scale-set/linux/data-disks/main.tf"
+ ],
+ "timestamp": 1642943280234,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/data-disks/variables.tf",
+ "/examples/vm-scale-set/linux/data-disks/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT177",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT177",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "data_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite",
+ "disk_size_gb": 10,
+ "lun": 10
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT178 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT178
new file mode 100644
index 0000000..0035ceb
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT178
@@ -0,0 +1,129 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/ephemeral-os-disk/variables.tf",
+ "/examples/vm-scale-set/linux/ephemeral-os-disk/main.tf"
+ ],
+ "timestamp": 1642943280239,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/ephemeral-os-disk/variables.tf",
+ "/examples/vm-scale-set/linux/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT178",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT178",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2s_v2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite",
+ "diff_disk_settings": [
+ {
+ "option": "Local"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT179 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT179
new file mode 100644
index 0000000..16593a8
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT179
@@ -0,0 +1,135 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/extensions/variables.tf",
+ "/examples/vm-scale-set/linux/extensions/main.tf"
+ ],
+ "timestamp": 1642943280244,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/extensions/variables.tf",
+ "/examples/vm-scale-set/linux/extensions/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT179",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT179",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "extension": [
+ {
+ "name": "CustomScript",
+ "publisher": "Microsoft.Azure.Extensions",
+ "type": "CustomScript",
+ "type_handler_version": 2.0,
+ "auto_upgrade_minor_version": true,
+ "settings": "jsonencode({'commandToExecute': 'echo $HOSTNAME'})",
+ "protected_settings": "jsonencode({'managedIdentity': {})}"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT18 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT18
new file mode 100644
index 0000000..7ab5468
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT18
@@ -0,0 +1,163 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service-certificate/stored-in-keyvault/variables.tf",
+ "/examples/app-service-certificate/stored-in-keyvault/main.tf"
+ ],
+ "timestamp": 1642943279622,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-certificate/stored-in-keyvault/variables.tf",
+ "/examples/app-service-certificate/stored-in-keyvault/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT18",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_certificate",
+ "azurerm_key_vault",
+ "azurerm_resource_group",
+ "azurerm_key_vault_certificate",
+ "azurerm_key_vault_access_policy"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT18",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "data": {
+ "azurerm_client_config": {
+ "current": {
+ "compiletime_identity": "data.azurerm_client_config.current"
+ }
+ },
+ "azuread_service_principal": {
+ "web_app_resource_provider": {
+ "application_id": "abfa0a7c-a6b6-4736-8310-5855508787cd",
+ "compiletime_identity": "data.azuread_service_principal.web_app_resource_provider"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_key_vault",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-key-vault",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "sku_name": "standard",
+ "compiletime_identity": "azurerm_key_vault.example"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_access_policy",
+ "name": "current_user",
+ "properties": {
+ "key_vault_id": "${azurerm_key_vault.example.id}",
+ "tenant_id": "${azurerm_key_vault.example.tenant_id}",
+ "object_id": "${data.azurerm_client_config.current.object_id}",
+ "certificate_permissions": [
+ "get",
+ "import"
+ ],
+ "compiletime_identity": "azurerm_key_vault_access_policy.current_user"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_access_policy",
+ "name": "web_app_resource_provider",
+ "properties": {
+ "key_vault_id": "${azurerm_key_vault.example.id}",
+ "tenant_id": "${azurerm_key_vault.example.tenant_id}",
+ "object_id": "${data.azuread_service_principal.web_app_resource_provider.id}",
+ "secret_permissions": [
+ "get"
+ ],
+ "certificate_permissions": [
+ "get"
+ ],
+ "compiletime_identity": "azurerm_key_vault_access_policy.web_app_resource_provider"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-cert",
+ "key_vault_id": "${azurerm_key_vault.example.id}",
+ "certificate": [
+ {
+ "contents": "${filebase64(\"certificate.pfx\")}",
+ "password": "terraform"
+ }
+ ],
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Unknown"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": false
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ]
+ }
+ ],
+ "depends_on": [
+ "${azurerm_key_vault_access_policy.current_user}"
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service_certificate",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-cert",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "key_vault_secret_id": "${azurerm_key_vault_certificate.example.secret_id}",
+ "compiletime_identity": "azurerm_app_service_certificate.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT180 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT180
new file mode 100644
index 0000000..44a71d4
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT180
@@ -0,0 +1,96 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/ipv6/variables.tf",
+ "/examples/vm-scale-set/linux/ipv6/main.tf"
+ ],
+ "timestamp": 1642943280249,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/ipv6/variables.tf",
+ "/examples/vm-scale-set/linux/ipv6/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT180",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT180",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "version": "IPv6"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT181 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT181
new file mode 100644
index 0000000..a8b6861
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT181
@@ -0,0 +1,134 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/multiple-nics/variables.tf",
+ "/examples/vm-scale-set/linux/multiple-nics/main.tf"
+ ],
+ "timestamp": 1642943280252,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/multiple-nics/variables.tf",
+ "/examples/vm-scale-set/linux/multiple-nics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT181",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT181",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "primary",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ },
+ {
+ "name": "secondary",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT182 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT182
new file mode 100644
index 0000000..e441177
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT182
@@ -0,0 +1,141 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/public-ip-per-instance/variables.tf",
+ "/examples/vm-scale-set/linux/public-ip-per-instance/main.tf"
+ ],
+ "timestamp": 1642943280255,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/public-ip-per-instance/variables.tf",
+ "/examples/vm-scale-set/linux/public-ip-per-instance/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT182",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_public_ip_prefix",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT182",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip_prefix",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_public_ip_prefix.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "public_ip_address": [
+ {
+ "name": "first",
+ "public_ip_prefix_id": "${azurerm_public_ip_prefix.main.id}"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT183 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT183
new file mode 100644
index 0000000..bbcbac7
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT183
@@ -0,0 +1,229 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/rolling-upgrade-policy/variables.tf",
+ "/examples/vm-scale-set/linux/rolling-upgrade-policy/main.tf"
+ ],
+ "timestamp": 1642943280258,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/rolling-upgrade-policy/variables.tf",
+ "/examples/vm-scale-set/linux/rolling-upgrade-policy/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT183",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb_nat_pool",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT183",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-publicip",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.main"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-lb",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "internal",
+ "public_ip_address_id": "${azurerm_public_ip.main.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "main",
+ "properties": {
+ "name": "backend-pool",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "compiletime_identity": "azurerm_lb_backend_address_pool.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_pool",
+ "name": "main",
+ "properties": {
+ "name": "nat-pool",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "frontend_ip_configuration_name": "internal",
+ "protocol": "Tcp",
+ "frontend_port_start": 80,
+ "frontend_port_end": 90,
+ "backend_port": 8080,
+ "compiletime_identity": "azurerm_lb_nat_pool.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "main",
+ "properties": {
+ "name": "lb-probe",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "port": 22,
+ "protocol": "Tcp",
+ "compiletime_identity": "azurerm_lb_probe.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "main",
+ "properties": {
+ "name": "lb-rule",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "probe_id": "${azurerm_lb_probe.main.id}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.main.id}",
+ "frontend_ip_configuration_name": "internal",
+ "protocol": "Tcp",
+ "frontend_port": 22,
+ "backend_port": 22,
+ "compiletime_identity": "azurerm_lb_rule.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "health_probe_id": "${azurerm_lb_probe.main.id}",
+ "upgrade_mode": "Rolling",
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "load_balancer_backend_address_pool_ids": [
+ "${azurerm_lb_backend_address_pool.main.id}"
+ ],
+ "load_balancer_inbound_nat_rules_ids": [
+ "${azurerm_lb_nat_pool.main.id}"
+ ]
+ }
+ ]
+ }
+ ],
+ "rolling_upgrade_policy": [
+ {
+ "max_batch_instance_percent": 21,
+ "max_unhealthy_instance_percent": 22,
+ "max_unhealthy_upgraded_instance_percent": 23,
+ "pause_time_between_batches": "PT30S"
+ }
+ ],
+ "depends_on": [
+ "${azurerm_lb_rule.main}"
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT184 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT184
new file mode 100644
index 0000000..7c0cb9b
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT184
@@ -0,0 +1,237 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/secrets/variables.tf",
+ "/examples/vm-scale-set/linux/secrets/main.tf"
+ ],
+ "timestamp": 1642943280262,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/secrets/variables.tf",
+ "/examples/vm-scale-set/linux/secrets/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT184",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT184",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "data": {
+ "azurerm_client_config": {
+ "current": {
+ "compiletime_identity": "data.azurerm_client_config.current"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_key_vault",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}kv",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "sku_name": "standard",
+ "enabled_for_template_deployment": true,
+ "enabled_for_deployment": true,
+ "access_policy": [
+ {
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "object_id": "${data.azurerm_client_config.current.object_id}",
+ "certificate_permissions": [
+ "create",
+ "delete",
+ "get",
+ "update"
+ ],
+ "key_permissions": [
+ "create"
+ ],
+ "secret_permissions": [
+ "set"
+ ],
+ "storage_permissions": [
+ "set"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault.main"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "main",
+ "properties": {
+ "name": "first",
+ "key_vault_id": "${azurerm_key_vault.main.id}",
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Self"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": true
+ }
+ ],
+ "lifetime_action": [
+ {
+ "action": [
+ {
+ "action_type": "AutoRenew"
+ }
+ ],
+ "trigger": [
+ {
+ "days_before_expiry": 30
+ }
+ ]
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ],
+ "x509_certificate_properties": [
+ {
+ "key_usage": [
+ "cRLSign",
+ "dataEncipherment",
+ "digitalSignature",
+ "keyAgreement",
+ "keyCertSign",
+ "keyEncipherment"
+ ],
+ "subject": "CN=hello-world-first",
+ "validity_in_months": 12
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "secret": [
+ {
+ "key_vault_id": "${azurerm_key_vault.main.id}",
+ "certificate": [
+ {
+ "url": "${azurerm_key_vault_certificate.main.secret_id}"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT185 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT185
new file mode 100644
index 0000000..41ce9ff
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT185
@@ -0,0 +1,127 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/spot/variables.tf",
+ "/examples/vm-scale-set/linux/spot/main.tf"
+ ],
+ "timestamp": 1642943280266,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/spot/variables.tf",
+ "/examples/vm-scale-set/linux/spot/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT185",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT185",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "eviction_policy": "Delete",
+ "priority": "Spot",
+ "max_bid_price": 0.5,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT186 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT186
new file mode 100644
index 0000000..34e2841
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT186
@@ -0,0 +1,128 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/ssh-keys/variables.tf",
+ "/examples/vm-scale-set/linux/ssh-keys/main.tf"
+ ],
+ "timestamp": 1642943280270,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/ssh-keys/variables.tf",
+ "/examples/vm-scale-set/linux/ssh-keys/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT186",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT186",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_ssh_key": [
+ {
+ "username": "adminuser",
+ "public_key": "${file(\"~/.ssh/id_rsa.pub\")}"
+ }
+ ],
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT187 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT187
new file mode 100644
index 0000000..cf21095
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT187
@@ -0,0 +1,136 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/system-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/linux/system-assigned-identity/main.tf"
+ ],
+ "timestamp": 1642943280274,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/system-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/linux/system-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT187",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT187",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "output": [
+ {
+ "vmss_principal_id": {
+ "value": "${azurerm_linux_virtual_machine_scale_set.main.identity[0].principal_id}"
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "identity": [
+ {
+ "type": "SystemAssigned"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT188 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT188
new file mode 100644
index 0000000..fa4aed3
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT188
@@ -0,0 +1,143 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/user-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/linux/user-assigned-identity/main.tf"
+ ],
+ "timestamp": 1642943280277,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/user-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/linux/user-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT188",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT188",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_user_assigned_identity",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmssidentity",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "compiletime_identity": "azurerm_user_assigned_identity.main"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "identity": [
+ {
+ "type": "UserAssigned",
+ "identity_ids": [
+ "${azurerm_user_assigned_identity.main.id}"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT189 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT189
new file mode 100644
index 0000000..2d8ee98
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT189
@@ -0,0 +1,130 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/linux/zones/variables.tf",
+ "/examples/vm-scale-set/linux/zones/main.tf"
+ ],
+ "timestamp": 1642943280281,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/linux/zones/variables.tf",
+ "/examples/vm-scale-set/linux/zones/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT189",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_linux_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT189",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "disable_password_authentication": false,
+ "zones": [
+ 1,
+ 2,
+ 3
+ ],
+ "zone_balance": true,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT19 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT19
new file mode 100644
index 0000000..d1eecaf
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT19
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/examples/app-service-certificate/stored-in-keyvault/certificate.pfx"
+ ],
+ "timestamp": 1642943279625,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/examples/app-service-certificate/stored-in-keyvault/certificate.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT19",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT19",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT190 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT190
new file mode 100644
index 0000000..b032ac7
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT190
@@ -0,0 +1,230 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/automatic-rolling-updates/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/automatic-rolling-updates/main.tf"
+ ],
+ "timestamp": 1642943280285,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/automatic-rolling-updates/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/automatic-rolling-updates/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT190",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_virtual_machine_scale_set",
+ "azurerm_lb_probe"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT190",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "frontend_ip_configuration_name": "internal"
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-publicip",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}lb",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "${local.frontend_ip_configuration_name}",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "example",
+ "properties": {
+ "name": "backend",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "compiletime_identity": "azurerm_lb_backend_address_pool.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "example",
+ "properties": {
+ "name": "ssh-running-probe",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "port": 22,
+ "protocol": "Tcp",
+ "compiletime_identity": "azurerm_lb_probe.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "probe_id": "${azurerm_lb_probe.example.id}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.example.id}",
+ "frontend_ip_configuration_name": "${local.frontend_ip_configuration_name}",
+ "name": "LBRule",
+ "protocol": "Tcp",
+ "frontend_port": 22,
+ "backend_port": 22,
+ "compiletime_identity": "azurerm_lb_rule.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_scale_set",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "overprovision": true,
+ "upgrade_policy_mode": "Rolling",
+ "automatic_os_upgrade": true,
+ "health_probe_id": "${azurerm_lb_probe.example.id}",
+ "rolling_upgrade_policy": [
+ {
+ "max_batch_instance_percent": 20,
+ "max_unhealthy_instance_percent": 20,
+ "max_unhealthy_upgraded_instance_percent": 20,
+ "pause_time_between_batches": "PT0S"
+ }
+ ],
+ "sku": [
+ {
+ "name": "Standard_D1_v2",
+ "tier": "Standard",
+ "capacity": 2
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name_prefix": "${var.prefix}-vm",
+ "admin_username": "myadmin",
+ "admin_password": "Passwword1234"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "network_profile": [
+ {
+ "name": "internal",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "load_balancer_backend_address_pool_ids": [
+ "${azurerm_lb_backend_address_pool.example.id}"
+ ],
+ "primary": true
+ }
+ ]
+ }
+ ],
+ "storage_profile_os_disk": [
+ {
+ "name": "",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "storage_profile_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine_scale_set.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT191 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT191
new file mode 100644
index 0000000..434135f
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT191
@@ -0,0 +1,216 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/autoscale/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/autoscale/main.tf"
+ ],
+ "timestamp": 1642943280288,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/autoscale/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/autoscale/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT191",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_monitor_autoscale_setting",
+ "azurerm_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT191",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "instance_count": 2
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_scale_set",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "upgrade_policy_mode": "Manual",
+ "sku": [
+ {
+ "name": "Standard_D1_v2",
+ "tier": "Standard",
+ "capacity": "${local.instance_count}"
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name_prefix": "${var.prefix}-vm",
+ "admin_username": "myadmin",
+ "admin_password": "Passwword1234"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "network_profile": [
+ {
+ "name": "web_ss_net_profile",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "primary": true
+ }
+ ]
+ }
+ ],
+ "storage_profile_os_disk": [
+ {
+ "name": "",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "storage_profile_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine_scale_set.example"
+ }
+ },
+ {
+ "type": "azurerm_monitor_autoscale_setting",
+ "name": "example",
+ "properties": {
+ "name": "autoscale-cpu",
+ "target_resource_id": "${azurerm_virtual_machine_scale_set.example.id}",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "profile": [
+ {
+ "name": "autoscale-cpu",
+ "capacity": [
+ {
+ "default": "${local.instance_count}",
+ "minimum": 0,
+ "maximum": 1000
+ }
+ ],
+ "rule": [
+ {
+ "metric_trigger": [
+ {
+ "metric_name": "Percentage CPU",
+ "metric_resource_id": "${azurerm_virtual_machine_scale_set.example.id}",
+ "time_grain": "PT1M",
+ "statistic": "Average",
+ "time_window": "PT5M",
+ "time_aggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 75
+ }
+ ],
+ "scale_action": [
+ {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": 1,
+ "cooldown": "PT1M"
+ }
+ ]
+ },
+ {
+ "metric_trigger": [
+ {
+ "metric_name": "Percentage CPU",
+ "metric_resource_id": "${azurerm_virtual_machine_scale_set.example.id}",
+ "time_grain": "PT1M",
+ "statistic": "Average",
+ "time_window": "PT5M",
+ "time_aggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 15
+ }
+ ],
+ "scale_action": [
+ {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": 1,
+ "cooldown": "PT1M"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_autoscale_setting.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT192 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT192
new file mode 100644
index 0000000..126fdc9
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT192
@@ -0,0 +1,141 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/basic/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/basic/main.tf"
+ ],
+ "timestamp": 1642943280292,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/basic/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT192",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT192",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "internal",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_prefixes": [
+ "10.0.1.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_machine_scale_set",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "upgrade_policy_mode": "Manual",
+ "sku": [
+ {
+ "name": "Standard_D1_v2",
+ "tier": "Standard",
+ "capacity": 2
+ }
+ ],
+ "os_profile": [
+ {
+ "computer_name_prefix": "${var.prefix}-vm",
+ "admin_username": "myadmin",
+ "admin_password": "Passwword1234"
+ }
+ ],
+ "os_profile_linux_config": [
+ {
+ "disable_password_authentication": false
+ }
+ ],
+ "network_profile": [
+ {
+ "name": "web_ss_net_profile",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "primary": true
+ }
+ ]
+ }
+ ],
+ "storage_profile_os_disk": [
+ {
+ "name": "",
+ "caching": "ReadWrite",
+ "create_option": "FromImage",
+ "managed_disk_type": "Standard_LRS"
+ }
+ ],
+ "storage_profile_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "compiletime_identity": "azurerm_virtual_machine_scale_set.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT193 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT193
new file mode 100644
index 0000000..3852c1a
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT193
@@ -0,0 +1,203 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/loadbalancer-probe/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/loadbalancer-probe/main.tf"
+ ],
+ "timestamp": 1642943280296,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/virtual_machine_scale_set/loadbalancer-probe/variables.tf",
+ "/examples/vm-scale-set/virtual_machine_scale_set/loadbalancer-probe/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT193",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb_nat_pool",
+ "azurerm_linux_virtual_machine_scale_set",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT193",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vnet",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-subnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "allocation_method": "Dynamic",
+ "domain_name_label": "${azurerm_resource_group.example.name}",
+ "compiletime_identity": "azurerm_public_ip.example"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-lb",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "PublicIPAddress",
+ "public_ip_address_id": "${azurerm_public_ip.example.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "BackEndAddressPool",
+ "compiletime_identity": "azurerm_lb_backend_address_pool.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "name": "ssh-probe",
+ "protocol": "Tcp",
+ "port": 22,
+ "compiletime_identity": "azurerm_lb_probe.example"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_pool",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "name": "ssh",
+ "loadbalancer_id": "${azurerm_lb.example.id}",
+ "protocol": "Tcp",
+ "frontend_port_start": 220,
+ "frontend_port_end": 229,
+ "backend_port": 22,
+ "frontend_ip_configuration_name": "PublicIPAddress",
+ "compiletime_identity": "azurerm_lb_nat_pool.example"
+ }
+ },
+ {
+ "type": "azurerm_linux_virtual_machine_scale_set",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "location": "${azurerm_resource_group.example.location}",
+ "sku": "Standard_F2",
+ "instances": 1,
+ "admin_username": "testuser",
+ "admin_password": "P@sstoken4567!",
+ "disable_password_authentication": false,
+ "source_image_reference": [
+ {
+ "publisher": "Canonical",
+ "offer": "UbuntuServer",
+ "sku": "16.04-LTS",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "load_balancer_backend_address_pool_ids": [
+ "${azurerm_lb_backend_address_pool.example.id}"
+ ],
+ "load_balancer_inbound_nat_rules_ids": [
+ "${azurerm_lb_nat_pool.example.id}"
+ ]
+ }
+ ]
+ }
+ ],
+ "depends_on": [
+ "${azurerm_lb_probe.example}"
+ ],
+ "compiletime_identity": "azurerm_linux_virtual_machine_scale_set.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT194 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT194
new file mode 100644
index 0000000..e4199a9
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT194
@@ -0,0 +1,201 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/auto-scaling/variables.tf",
+ "/examples/vm-scale-set/windows/auto-scaling/main.tf"
+ ],
+ "timestamp": 1642943280300,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/auto-scaling/variables.tf",
+ "/examples/vm-scale-set/windows/auto-scaling/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT194",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_monitor_autoscale_setting"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT194",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "lifecycle": [
+ {
+ "ignore_changes": [
+ "instances"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ },
+ {
+ "type": "azurerm_monitor_autoscale_setting",
+ "name": "main",
+ "properties": {
+ "name": "autoscale-config",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "target_resource_id": "${azurerm_windows_virtual_machine_scale_set.main.id}",
+ "profile": [
+ {
+ "name": "AutoScale",
+ "capacity": [
+ {
+ "default": 3,
+ "minimum": 1,
+ "maximum": 5
+ }
+ ],
+ "rule": [
+ {
+ "metric_trigger": [
+ {
+ "metric_name": "Percentage CPU",
+ "metric_resource_id": "${azurerm_windows_virtual_machine_scale_set.main.id}",
+ "time_grain": "PT1M",
+ "statistic": "Average",
+ "time_window": "PT5M",
+ "time_aggregation": "Average",
+ "operator": "GreaterThan",
+ "threshold": 75
+ }
+ ],
+ "scale_action": [
+ {
+ "direction": "Increase",
+ "type": "ChangeCount",
+ "value": 1,
+ "cooldown": "PT1M"
+ }
+ ]
+ },
+ {
+ "metric_trigger": [
+ {
+ "metric_name": "Percentage CPU",
+ "metric_resource_id": "${azurerm_windows_virtual_machine_scale_set.main.id}",
+ "time_grain": "PT1M",
+ "statistic": "Average",
+ "time_window": "PT5M",
+ "time_aggregation": "Average",
+ "operator": "LessThan",
+ "threshold": 25
+ }
+ ],
+ "scale_action": [
+ {
+ "direction": "Decrease",
+ "type": "ChangeCount",
+ "value": 1,
+ "cooldown": "PT1M"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_autoscale_setting.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT195 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT195
new file mode 100644
index 0000000..dd0cdf6
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT195
@@ -0,0 +1,124 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/basic/variables.tf",
+ "/examples/vm-scale-set/windows/basic/main.tf"
+ ],
+ "timestamp": 1642943280306,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/basic/variables.tf",
+ "/examples/vm-scale-set/windows/basic/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT195",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT195",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT196 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT196
new file mode 100644
index 0000000..f3c027d
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT196
@@ -0,0 +1,141 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/boot-diagnostics/variables.tf",
+ "/examples/vm-scale-set/windows/boot-diagnostics/main.tf"
+ ],
+ "timestamp": 1642943280310,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/boot-diagnostics/variables.tf",
+ "/examples/vm-scale-set/windows/boot-diagnostics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT196",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_storage_account"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT196",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}stor",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "boot_diagnostics": [
+ {
+ "storage_account_uri": "${azurerm_storage_account.main.primary_blob_endpoint}"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT197 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT197
new file mode 100644
index 0000000..27d4467
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT197
@@ -0,0 +1,125 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/custom-data/variables.tf",
+ "/examples/vm-scale-set/windows/custom-data/main.tf"
+ ],
+ "timestamp": 1642943280314,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/custom-data/variables.tf",
+ "/examples/vm-scale-set/windows/custom-data/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT197",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT197",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "custom_data": "base64_encode(\"example custom data\")",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT198 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT198
new file mode 100644
index 0000000..b231e04
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT198
@@ -0,0 +1,125 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/custom-timezone/variables.tf",
+ "/examples/vm-scale-set/windows/custom-timezone/main.tf"
+ ],
+ "timestamp": 1642943280318,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/custom-timezone/variables.tf",
+ "/examples/vm-scale-set/windows/custom-timezone/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT198",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT198",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "timezone": "Hawaiian Standard Time",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT199 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT199
new file mode 100644
index 0000000..6d3256c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT199
@@ -0,0 +1,132 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/data-disks/variables.tf",
+ "/examples/vm-scale-set/windows/data-disks/main.tf"
+ ],
+ "timestamp": 1642943280322,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/data-disks/variables.tf",
+ "/examples/vm-scale-set/windows/data-disks/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT199",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT199",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "data_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite",
+ "disk_size_gb": 10,
+ "lun": 10
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT2 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT2
new file mode 100644
index 0000000..c4e5726
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT2
@@ -0,0 +1,167 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service/backup/output.tf",
+ "/examples/app-service/backup/variables.tf",
+ "/examples/app-service/backup/main.tf"
+ ],
+ "timestamp": 1642943279558,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service/backup/output.tf",
+ "/examples/app-service/backup/variables.tf",
+ "/examples/app-service/backup/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT2",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_resource_group",
+ "azurerm_app_service_plan",
+ "azurerm_storage_container",
+ "azurerm_storage_account",
+ "azurerm_app_service"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT2",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "data": {
+ "azurerm_storage_account_sas": {
+ "test": {
+ "connection_string": "${azurerm_storage_account.test.primary_connection_string}",
+ "https_only": true,
+ "resource_types": [
+ {
+ "service": false,
+ "container": false,
+ "object": true
+ }
+ ],
+ "services": [
+ {
+ "blob": true,
+ "queue": false,
+ "table": false,
+ "file": false
+ }
+ ],
+ "start": "2019-03-21",
+ "expiry": "2020-03-21",
+ "permissions": [
+ {
+ "read": false,
+ "write": true,
+ "delete": false,
+ "list": false,
+ "add": false,
+ "create": false,
+ "update": false,
+ "process": false
+ }
+ ],
+ "compiletime_identity": "data.azurerm_storage_account_sas.test"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.test"
+ }
+ },
+ {
+ "type": "azurerm_storage_account",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}sa",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "location": "${azurerm_resource_group.test.location}",
+ "account_tier": "Standard",
+ "account_replication_type": "LRS",
+ "compiletime_identity": "azurerm_storage_account.test"
+ }
+ },
+ {
+ "type": "azurerm_storage_container",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}-sc",
+ "storage_account_name": "${azurerm_storage_account.test.name}",
+ "container_access_type": "private",
+ "compiletime_identity": "azurerm_storage_container.test"
+ }
+ },
+ {
+ "type": "azurerm_app_service_plan",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}-splan",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "sku": [
+ {
+ "tier": "Standard",
+ "size": "S1"
+ }
+ ],
+ "compiletime_identity": "azurerm_app_service_plan.test"
+ }
+ },
+ {
+ "type": "azurerm_app_service",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}-appservice",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "app_service_plan_id": "${azurerm_app_service_plan.test.id}",
+ "backup": [
+ {
+ "name": "Example",
+ "storage_account_url": "https://${azurerm_storage_account.test.name}.blob.core.windows.net/${azurerm_storage_container.test.name}${data.azurerm_storage_account_sas.test.sas}&sr=b",
+ "schedule": [
+ {
+ "frequency_interval": 30,
+ "frequency_unit": "Day"
+ }
+ ]
+ }
+ ],
+ "site_config": [
+ {
+ "dotnet_framework_version": "v4.0",
+ "scm_type": "LocalGit"
+ }
+ ],
+ "app_settings": {
+ "SOME_KEY": "some-value"
+ },
+ "compiletime_identity": "azurerm_app_service.test"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT20 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT20
new file mode 100644
index 0000000..0ab9a94
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT20
@@ -0,0 +1,68 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service-certificate-order/standard/outputs.tf",
+ "/examples/app-service-certificate-order/standard/variables.tf",
+ "/examples/app-service-certificate-order/standard/main.tf"
+ ],
+ "timestamp": 1642943279627,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-certificate-order/standard/outputs.tf",
+ "/examples/app-service-certificate-order/standard/variables.tf",
+ "/examples/app-service-certificate-order/standard/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT20",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_certificate_order",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT20",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service_certificate_order",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}-autoacc",
+ "location": "global",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "distinguished_name": "CN=example.com",
+ "product_type": "standard",
+ "compiletime_identity": "azurerm_app_service_certificate_order.test"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT200 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT200
new file mode 100644
index 0000000..01b2431
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT200
@@ -0,0 +1,129 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/ephemeral-os-disk/variables.tf",
+ "/examples/vm-scale-set/windows/ephemeral-os-disk/main.tf"
+ ],
+ "timestamp": 1642943280326,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/ephemeral-os-disk/variables.tf",
+ "/examples/vm-scale-set/windows/ephemeral-os-disk/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT200",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT200",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2s_v2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite",
+ "diff_disk_settings": [
+ {
+ "option": "Local"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT201 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT201
new file mode 100644
index 0000000..07e39c6
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT201
@@ -0,0 +1,142 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/extensions/variables.tf",
+ "/examples/vm-scale-set/windows/extensions/main.tf"
+ ],
+ "timestamp": 1642943280330,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/extensions/variables.tf",
+ "/examples/vm-scale-set/windows/extensions/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT201",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT201",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "extension": [
+ {
+ "name": "CustomScript",
+ "publisher": "Microsoft.Compute",
+ "type": "CustomScriptExtension",
+ "type_handler_version": 1.1,
+ "auto_upgrade_minor_version": true,
+ "settings": "${jsonencode({'commandToExecute': 'powershell.exe -c \\\\\"Get-Content env:computername\\\\\"'})}",
+ "protected_settings": "jsonencode({'managedIdentity': {})}"
+ },
+ {
+ "name": "AADLoginForWindows",
+ "publisher": "Microsoft.Azure.ActiveDirectory",
+ "type": "AADLoginForWindows",
+ "type_handler_version": 1.0,
+ "auto_upgrade_minor_version": true
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT202 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT202
new file mode 100644
index 0000000..52dabd8
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT202
@@ -0,0 +1,125 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/hybrid-use-benefit/variables.tf",
+ "/examples/vm-scale-set/windows/hybrid-use-benefit/main.tf"
+ ],
+ "timestamp": 1642943280334,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/hybrid-use-benefit/variables.tf",
+ "/examples/vm-scale-set/windows/hybrid-use-benefit/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT202",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT202",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "license_type": "Windows_Server",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT203 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT203
new file mode 100644
index 0000000..608d062
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT203
@@ -0,0 +1,96 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/ipv6/variables.tf",
+ "/examples/vm-scale-set/windows/ipv6/main.tf"
+ ],
+ "timestamp": 1642943280338,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/ipv6/variables.tf",
+ "/examples/vm-scale-set/windows/ipv6/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT203",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT203",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "version": "IPv6"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT204 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT204
new file mode 100644
index 0000000..1fc1a71
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT204
@@ -0,0 +1,134 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/multiple-nics/variables.tf",
+ "/examples/vm-scale-set/windows/multiple-nics/main.tf"
+ ],
+ "timestamp": 1642943280343,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/multiple-nics/variables.tf",
+ "/examples/vm-scale-set/windows/multiple-nics/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT204",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT204",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "primary",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ },
+ {
+ "name": "secondary",
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT205 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT205
new file mode 100644
index 0000000..79a3955
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT205
@@ -0,0 +1,141 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/public-ip-per-instance/variables.tf",
+ "/examples/vm-scale-set/windows/public-ip-per-instance/main.tf"
+ ],
+ "timestamp": 1642943280347,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/public-ip-per-instance/variables.tf",
+ "/examples/vm-scale-set/windows/public-ip-per-instance/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT205",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_public_ip_prefix",
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT205",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip_prefix",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-pip",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_public_ip_prefix.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "public_ip_address": [
+ {
+ "name": "first",
+ "public_ip_prefix_id": "${azurerm_public_ip_prefix.main.id}"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT206 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT206
new file mode 100644
index 0000000..15e4203
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT206
@@ -0,0 +1,229 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/rolling-upgrade-policy/variables.tf",
+ "/examples/vm-scale-set/windows/rolling-upgrade-policy/main.tf"
+ ],
+ "timestamp": 1642943280351,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/rolling-upgrade-policy/variables.tf",
+ "/examples/vm-scale-set/windows/rolling-upgrade-policy/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT206",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_lb_backend_address_pool",
+ "azurerm_lb_rule",
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_lb_nat_pool",
+ "azurerm_lb",
+ "azurerm_public_ip",
+ "azurerm_lb_probe"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT206",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-publicip",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "allocation_method": "Static",
+ "compiletime_identity": "azurerm_public_ip.main"
+ }
+ },
+ {
+ "type": "azurerm_lb",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-lb",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "frontend_ip_configuration": [
+ {
+ "name": "internal",
+ "public_ip_address_id": "${azurerm_public_ip.main.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_lb.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_backend_address_pool",
+ "name": "main",
+ "properties": {
+ "name": "backend-pool",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "compiletime_identity": "azurerm_lb_backend_address_pool.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_nat_pool",
+ "name": "main",
+ "properties": {
+ "name": "nat-pool",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "frontend_ip_configuration_name": "internal",
+ "protocol": "Tcp",
+ "frontend_port_start": 80,
+ "frontend_port_end": 90,
+ "backend_port": 8080,
+ "compiletime_identity": "azurerm_lb_nat_pool.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_probe",
+ "name": "main",
+ "properties": {
+ "name": "lb-probe",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "port": 22,
+ "protocol": "Tcp",
+ "compiletime_identity": "azurerm_lb_probe.main"
+ }
+ },
+ {
+ "type": "azurerm_lb_rule",
+ "name": "main",
+ "properties": {
+ "name": "lb-rule",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "loadbalancer_id": "${azurerm_lb.main.id}",
+ "probe_id": "${azurerm_lb_probe.main.id}",
+ "backend_address_pool_id": "${azurerm_lb_backend_address_pool.main.id}",
+ "frontend_ip_configuration_name": "internal",
+ "protocol": "Tcp",
+ "frontend_port": 22,
+ "backend_port": 22,
+ "compiletime_identity": "azurerm_lb_rule.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "health_probe_id": "${azurerm_lb_probe.main.id}",
+ "upgrade_mode": "Rolling",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}",
+ "load_balancer_backend_address_pool_ids": [
+ "${azurerm_lb_backend_address_pool.main.id}"
+ ],
+ "load_balancer_inbound_nat_rules_ids": [
+ "${azurerm_lb_nat_pool.main.id}"
+ ]
+ }
+ ]
+ }
+ ],
+ "rolling_upgrade_policy": [
+ {
+ "max_batch_instance_percent": 21,
+ "max_unhealthy_instance_percent": 22,
+ "max_unhealthy_upgraded_instance_percent": 23,
+ "pause_time_between_batches": "PT30S"
+ }
+ ],
+ "depends_on": [
+ "azurerm_lb_rule.main"
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT207 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT207
new file mode 100644
index 0000000..6e08091
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT207
@@ -0,0 +1,331 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/secrets/variables.tf",
+ "/examples/vm-scale-set/windows/secrets/main.tf"
+ ],
+ "timestamp": 1642943280356,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/secrets/variables.tf",
+ "/examples/vm-scale-set/windows/secrets/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT207",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT207",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "data": {
+ "azurerm_client_config": {
+ "current": {
+ "compiletime_identity": "data.azurerm_client_config.current"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_key_vault",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}kv",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "sku_name": "standard",
+ "enabled_for_template_deployment": true,
+ "enabled_for_deployment": true,
+ "access_policy": [
+ {
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "object_id": "${data.azurerm_client_config.current.object_id}",
+ "certificate_permissions": [
+ "create",
+ "delete",
+ "get",
+ "update"
+ ],
+ "key_permissions": [
+ "create"
+ ],
+ "secret_permissions": [
+ "set"
+ ],
+ "storage_permissions": [
+ "set"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault.main"
+ }
+ },
+ {
+ "type": "azurerm_key_vault",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}kv",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "sku_name": "standard",
+ "enabled_for_template_deployment": true,
+ "enabled_for_deployment": true,
+ "access_policy": [
+ {
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "object_id": "${data.azurerm_client_config.current.object_id}",
+ "certificate_permissions": [
+ "create",
+ "delete",
+ "get",
+ "update"
+ ],
+ "key_permissions": [
+ "create"
+ ],
+ "secret_permissions": [
+ "set"
+ ],
+ "storage_permissions": [
+ "set"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault.main"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "main",
+ "properties": {
+ "name": "first",
+ "key_vault_id": "${azurerm_key_vault.main.id}",
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Self"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": true
+ }
+ ],
+ "lifetime_action": [
+ {
+ "action": [
+ {
+ "action_type": "AutoRenew"
+ }
+ ],
+ "trigger": [
+ {
+ "days_before_expiry": 30
+ }
+ ]
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ],
+ "x509_certificate_properties": [
+ {
+ "key_usage": [
+ "cRLSign",
+ "dataEncipherment",
+ "digitalSignature",
+ "keyAgreement",
+ "keyCertSign",
+ "keyEncipherment"
+ ],
+ "subject": "CN=hello-world-first",
+ "validity_in_months": 12
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.main"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "main",
+ "properties": {
+ "name": "first",
+ "key_vault_id": "${azurerm_key_vault.main.id}",
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Self"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": true
+ }
+ ],
+ "lifetime_action": [
+ {
+ "action": [
+ {
+ "action_type": "AutoRenew"
+ }
+ ],
+ "trigger": [
+ {
+ "days_before_expiry": 30
+ }
+ ]
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ],
+ "x509_certificate_properties": [
+ {
+ "key_usage": [
+ "cRLSign",
+ "dataEncipherment",
+ "digitalSignature",
+ "keyAgreement",
+ "keyCertSign",
+ "keyEncipherment"
+ ],
+ "subject": "CN=hello-world-first",
+ "validity_in_months": 12
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "secret": [
+ {
+ "key_vault_id": "${azurerm_key_vault.main.id}",
+ "certificate": [
+ {
+ "url": "${azurerm_key_vault_certificate.main.secret_id}"
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT208 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT208
new file mode 100644
index 0000000..bf4554c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT208
@@ -0,0 +1,100 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/1-dependencies.tf"
+ ],
+ "timestamp": 1642943280360,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/1-dependencies.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT208",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_public_ip"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT208",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "locals": [
+ {
+ "vmss_name": "${var.prefix}-vmss",
+ "vmss_count": 3
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_public_ip",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-publicip",
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "allocation_method": "Static",
+ "domain_name_label": "${local.vmss_name}-pip",
+ "compiletime_identity": "azurerm_public_ip.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT209 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT209
new file mode 100644
index 0000000..a46f5e2
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT209
@@ -0,0 +1,243 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/2-key-vault.tf"
+ ],
+ "timestamp": 1642943280364,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/2-key-vault.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT209",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_key_vault",
+ "azurerm_key_vault_certificate"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT209",
+ "collection": "terraformtemplate",
+ "json": {
+ "data": {
+ "azurerm_client_config": {
+ "current": {
+ "compiletime_identity": "data.azurerm_client_config.current"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_key_vault",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}keyvault",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "sku_name": "standard",
+ "access_policy": [
+ {
+ "tenant_id": "${data.azurerm_client_config.current.tenant_id}",
+ "object_id": "${data.azurerm_client_config.current.object_id}",
+ "certificate_permissions": [
+ "create",
+ "delete",
+ "deleteissuers",
+ "get",
+ "getissuers",
+ "import",
+ "list",
+ "listissuers",
+ "managecontacts",
+ "manageissuers",
+ "setissuers",
+ "update"
+ ],
+ "key_permissions": [
+ "backup",
+ "create",
+ "decrypt",
+ "delete",
+ "encrypt",
+ "get",
+ "import",
+ "list",
+ "purge",
+ "recover",
+ "restore",
+ "sign",
+ "unwrapKey",
+ "update",
+ "verify",
+ "wrapKey"
+ ],
+ "secret_permissions": [
+ "backup",
+ "delete",
+ "get",
+ "list",
+ "purge",
+ "recover",
+ "restore",
+ "set"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault.main"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "primary",
+ "properties": {
+ "name": "${local.vmss_name}-primarycert",
+ "key_vault_id": "${azurerm_key_vault.main.id}",
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Self"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": true
+ }
+ ],
+ "lifetime_action": [
+ {
+ "action": [
+ {
+ "action_type": "AutoRenew"
+ }
+ ],
+ "trigger": [
+ {
+ "days_before_expiry": 30
+ }
+ ]
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ],
+ "x509_certificate_properties": [
+ {
+ "extended_key_usage": [
+ "1.3.6.1.5.5.7.3.1",
+ "1.3.6.1.5.5.7.3.2"
+ ],
+ "key_usage": [
+ "cRLSign",
+ "dataEncipherment",
+ "digitalSignature",
+ "keyAgreement",
+ "keyCertSign",
+ "keyEncipherment"
+ ],
+ "subject_alternative_names": [
+ {
+ "dns_names": [
+ "${azurerm_public_ip.main.fqdn}"
+ ]
+ }
+ ],
+ "subject": "CN=${local.vmss_name}",
+ "validity_in_months": 12
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.primary"
+ }
+ },
+ {
+ "type": "azurerm_key_vault_certificate",
+ "name": "secondary",
+ "properties": {
+ "name": "${local.vmss_name}-secondarycert",
+ "key_vault_id": "${azurerm_key_vault.main.id}",
+ "certificate_policy": [
+ {
+ "issuer_parameters": [
+ {
+ "name": "Self"
+ }
+ ],
+ "key_properties": [
+ {
+ "exportable": true,
+ "key_size": 2048,
+ "key_type": "RSA",
+ "reuse_key": true
+ }
+ ],
+ "lifetime_action": [
+ {
+ "action": [
+ {
+ "action_type": "AutoRenew"
+ }
+ ],
+ "trigger": [
+ {
+ "days_before_expiry": 30
+ }
+ ]
+ }
+ ],
+ "secret_properties": [
+ {
+ "content_type": "application/x-pkcs12"
+ }
+ ],
+ "x509_certificate_properties": [
+ {
+ "extended_key_usage": [
+ "1.3.6.1.5.5.7.3.1",
+ "1.3.6.1.5.5.7.3.2"
+ ],
+ "key_usage": [
+ "cRLSign",
+ "dataEncipherment",
+ "digitalSignature",
+ "keyAgreement",
+ "keyCertSign",
+ "keyEncipherment"
+ ],
+ "subject_alternative_names": [
+ {
+ "dns_names": [
+ "${azurerm_public_ip.main.fqdn}"
+ ]
+ }
+ ],
+ "subject": "CN=${local.vmss_name}",
+ "validity_in_months": 12
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_key_vault_certificate.secondary"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT21 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT21
new file mode 100644
index 0000000..8269f5a
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT21
@@ -0,0 +1,68 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service-certificate-order/wildcard/outputs.tf",
+ "/examples/app-service-certificate-order/wildcard/variables.tf",
+ "/examples/app-service-certificate-order/wildcard/main.tf"
+ ],
+ "timestamp": 1642943279631,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-certificate-order/wildcard/outputs.tf",
+ "/examples/app-service-certificate-order/wildcard/variables.tf",
+ "/examples/app-service-certificate-order/wildcard/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT21",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_certificate_order",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT21",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service_certificate_order",
+ "name": "test",
+ "properties": {
+ "name": "${var.prefix}-autoacc",
+ "location": "global",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "distinguished_name": "CN=*.example.com",
+ "product_type": "wildcard",
+ "compiletime_identity": "azurerm_app_service_certificate_order.test"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT210 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT210
new file mode 100644
index 0000000..d31c3be
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT210
@@ -0,0 +1,95 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/3-service-fabric.tf"
+ ],
+ "timestamp": 1642943280368,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/3-service-fabric.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT210",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_service_fabric_cluster"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT210",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_service_fabric_cluster",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-servicefabric",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "reliability_level": "Bronze",
+ "upgrade_mode": "Automatic",
+ "vm_image": "Windows",
+ "management_endpoint": "https://${azurerm_public_ip.main.fqdn}:19080",
+ "add_on_features": [
+ "DnsService"
+ ],
+ "node_type": [
+ {
+ "name": "primary",
+ "instance_count": 3,
+ "is_primary": true,
+ "client_endpoint_port": 2020,
+ "http_endpoint_port": 80
+ },
+ {
+ "name": "${local.vmss_name}",
+ "instance_count": "${local.vmss_count}",
+ "is_primary": true,
+ "client_endpoint_port": 19000,
+ "http_endpoint_port": 19080,
+ "application_ports": [
+ {
+ "start_port": 20000,
+ "end_port": 30000
+ }
+ ],
+ "ephemeral_ports": [
+ {
+ "start_port": 49152,
+ "end_port": 65534
+ }
+ ]
+ }
+ ],
+ "fabric_settings": [
+ {
+ "name": "Security",
+ "parameters": {
+ "ClusterProtectionLevel": "EncryptAndSign"
+ }
+ }
+ ],
+ "certificate": [
+ {
+ "thumbprint": "${azurerm_key_vault_certificate.primary.thumbprint}",
+ "thumbprint_secondary": "${azurerm_key_vault_certificate.secondary.thumbprint}",
+ "x509_store_name": "My"
+ }
+ ],
+ "compiletime_identity": "azurerm_service_fabric_cluster.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT211 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT211
new file mode 100644
index 0000000..ff65250
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT211
@@ -0,0 +1,77 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/main.tf"
+ ],
+ "timestamp": 1642943280373,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/service-fabric/variables.tf",
+ "/examples/vm-scale-set/windows/service-fabric/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT211",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT211",
+ "collection": "terraformtemplate",
+ "json": {
+ "resources": [
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT212 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT212
new file mode 100644
index 0000000..a324116
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT212
@@ -0,0 +1,127 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/spot/variables.tf",
+ "/examples/vm-scale-set/windows/spot/main.tf"
+ ],
+ "timestamp": 1642943280376,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/spot/variables.tf",
+ "/examples/vm-scale-set/windows/spot/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT212",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT212",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "eviction_policy": "Delete",
+ "priority": "Spot",
+ "max_bid_price": 0.5,
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT213 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT213
new file mode 100644
index 0000000..6271929
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT213
@@ -0,0 +1,135 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/system-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/windows/system-assigned-identity/main.tf"
+ ],
+ "timestamp": 1642943280380,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/system-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/windows/system-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT213",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT213",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "output": [
+ {
+ "vmss_principal_id": {
+ "value": "${azurerm_windows_virtual_machine_scale_set.main.identity[0].principal_id}"
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "identity": [
+ {
+ "type": "SystemAssigned"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT214 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT214
new file mode 100644
index 0000000..94a4764
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT214
@@ -0,0 +1,142 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/user-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/windows/user-assigned-identity/main.tf"
+ ],
+ "timestamp": 1642943280384,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/user-assigned-identity/variables.tf",
+ "/examples/vm-scale-set/windows/user-assigned-identity/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT214",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group",
+ "azurerm_user_assigned_identity"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT214",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_user_assigned_identity",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmssidentity",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "compiletime_identity": "azurerm_user_assigned_identity.main"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "identity": [
+ {
+ "type": "UserAssigned",
+ "identity_ids": [
+ "${azurerm_user_assigned_identity.main.id}"
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT215 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT215
new file mode 100644
index 0000000..cf5491f
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT215
@@ -0,0 +1,130 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/vm-scale-set/windows/zones/variables.tf",
+ "/examples/vm-scale-set/windows/zones/main.tf"
+ ],
+ "timestamp": 1642943280388,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/vm-scale-set/windows/zones/variables.tf",
+ "/examples/vm-scale-set/windows/zones/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT215",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_windows_virtual_machine_scale_set",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT215",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}-network",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "location": "${azurerm_resource_group.main.location}",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "compiletime_identity": "azurerm_virtual_network.main"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "internal",
+ "properties": {
+ "name": "internal",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "virtual_network_name": "${azurerm_virtual_network.main.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "compiletime_identity": "azurerm_subnet.internal"
+ }
+ },
+ {
+ "type": "azurerm_windows_virtual_machine_scale_set",
+ "name": "main",
+ "properties": {
+ "name": "${var.prefix}vmss",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "location": "${azurerm_resource_group.main.location}",
+ "sku": "Standard_F2",
+ "instances": 3,
+ "admin_username": "adminuser",
+ "admin_password": "P@ssw0rd1234!",
+ "computer_name_prefix": "${var.prefix}",
+ "zones": [
+ 1,
+ 2,
+ 3
+ ],
+ "zone_balance": true,
+ "source_image_reference": [
+ {
+ "publisher": "MicrosoftWindowsServer",
+ "offer": "WindowsServer",
+ "sku": "2019-Datacenter",
+ "version": "latest"
+ }
+ ],
+ "network_interface": [
+ {
+ "name": "example",
+ "primary": true,
+ "ip_configuration": [
+ {
+ "name": "internal",
+ "primary": true,
+ "subnet_id": "${azurerm_subnet.internal.id}"
+ }
+ ]
+ }
+ ],
+ "os_disk": [
+ {
+ "storage_account_type": "Standard_LRS",
+ "caching": "ReadWrite"
+ }
+ ],
+ "compiletime_identity": "azurerm_windows_virtual_machine_scale_set.main"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT216 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT216
new file mode 100644
index 0000000..49cb565
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT216
@@ -0,0 +1,111 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/web/static-site/main.tf"
+ ],
+ "timestamp": 1642943280392,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/web/static-site/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT216",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "github_repository_file",
+ "azurerm_static_site",
+ "github_actions_secret",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT216",
+ "collection": "terraformtemplate",
+ "json": {
+ "locals": [
+ {
+ "api_token_var": "AZURE_STATIC_WEB_APPS_API_TOKEN"
+ }
+ ],
+ "variable": [
+ {
+ "github_token": {}
+ },
+ {
+ "github_owner": {}
+ }
+ ],
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ },
+ {
+ "github": {
+ "token": "${var.github_token}",
+ "owner": "${var.github_owner}"
+ }
+ }
+ ],
+ "output": [
+ {
+ "hostname": {
+ "value": "${azurerm_static_site.test.default_host_name}"
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "test",
+ "properties": {
+ "name": "example",
+ "location": "west europe",
+ "compiletime_identity": "azurerm_resource_group.test"
+ }
+ },
+ {
+ "type": "azurerm_static_site",
+ "name": "test",
+ "properties": {
+ "name": "example",
+ "location": "${azurerm_resource_group.test.location}",
+ "resource_group_name": "${azurerm_resource_group.test.name}",
+ "compiletime_identity": "azurerm_static_site.test"
+ }
+ },
+ {
+ "type": "github_actions_secret",
+ "name": "test",
+ "properties": {
+ "repository": "my-first-static-web-app",
+ "secret_name": "${local.api_token_var}",
+ "plaintext_value": "${azurerm_static_site.test.api_key}",
+ "compiletime_identity": "github_actions_secret.test"
+ }
+ },
+ {
+ "type": "github_repository_file",
+ "name": "foo",
+ "properties": {
+ "repository": "my-first-static-web-app",
+ "branch": "main",
+ "file": ".github/workflows/azure-static-web-app.yml",
+ "content": "${templatefile(\"./azure-static-web-app.tpl\",,{'app_location': '/', 'api_location': 'api', 'output_location': '', 'api_token_var': '${local.api_token_var}'},)}",
+ "compiletime_identity": "github_repository_file.foo"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT217 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT217
new file mode 100644
index 0000000..330bd5e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT217
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/apimanagement/testdata/keyvaultcert.pfx"
+ ],
+ "timestamp": 1642943280396,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/apimanagement/testdata/keyvaultcert.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT217",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT217",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT218 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT218
new file mode 100644
index 0000000..4f0fb6c
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT218
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/attestation/testdata/cert.pem"
+ ],
+ "timestamp": 1642943280399,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/attestation/testdata/cert.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT218",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT218",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT219 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT219
new file mode 100644
index 0000000..493c1eb
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT219
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/automation/testdata/automation_certificate_test.pfx"
+ ],
+ "timestamp": 1642943280402,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/automation/testdata/automation_certificate_test.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT219",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT219",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT22 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT22
new file mode 100644
index 0000000..dc6ad3e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT22
@@ -0,0 +1,136 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/app-service-environment-v3/main.tf"
+ ],
+ "timestamp": 1642943279634,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/app-service-environment-v3/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT22",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_app_service_environment_v3",
+ "azurerm_subnet",
+ "azurerm_virtual_network",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT22",
+ "collection": "terraformtemplate",
+ "json": {
+ "terraform": [
+ {
+ "required_providers": [
+ {
+ "azurerm": {
+ "version": ">=2.76.0"
+ },
+ "random": {
+ "version": "3.1.0"
+ }
+ }
+ ]
+ }
+ ],
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "exampleRG1",
+ "location": "West Europe",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_virtual_network",
+ "name": "example",
+ "properties": {
+ "name": "example-vnet",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "address_space": [
+ "10.0.0.0/16"
+ ],
+ "compiletime_identity": "azurerm_virtual_network.example"
+ }
+ },
+ {
+ "type": "azurerm_subnet",
+ "name": "example",
+ "properties": {
+ "name": "example-subnet",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "virtual_network_name": "${azurerm_virtual_network.example.name}",
+ "address_prefixes": [
+ "10.0.2.0/24"
+ ],
+ "delegation": [
+ {
+ "name": "Microsoft.Web.hostingEnvironments",
+ "service_delegation": [
+ {
+ "name": "Microsoft.Web/hostingEnvironments",
+ "actions": [
+ "Microsoft.Network/virtualNetworks/subnets/action"
+ ]
+ }
+ ]
+ }
+ ],
+ "compiletime_identity": "azurerm_subnet.example"
+ }
+ },
+ {
+ "type": "azurerm_app_service_environment_v3",
+ "name": "example",
+ "properties": {
+ "name": "example-asev3",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "subnet_id": "${azurerm_subnet.example.id}",
+ "internal_load_balancing_mode": "Web, Publishing",
+ "cluster_setting": [
+ {
+ "name": "DisableTls1.0",
+ "value": 1
+ },
+ {
+ "name": "InternalEncryption",
+ "value": true
+ },
+ {
+ "name": "FrontEndSSLCipherSuiteOrder",
+ "value": "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
+ }
+ ],
+ "tags": {
+ "env": "production",
+ "terraformed": true
+ },
+ "compiletime_identity": "azurerm_app_service_environment_v3.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT220 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT220
new file mode 100644
index 0000000..ec69578
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT220
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/batch/testdata/batch_certificate_password.pfx"
+ ],
+ "timestamp": 1642943280405,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/batch/testdata/batch_certificate_password.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT220",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT220",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT221 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT221
new file mode 100644
index 0000000..da0c89e
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT221
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/datalake/testdata/application_gateway_test.cer"
+ ],
+ "timestamp": 1642943280408,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/datalake/testdata/application_gateway_test.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT221",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT221",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT222 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT222
new file mode 100644
index 0000000..770364a
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT222
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/datashare/testdata/application_gateway_test.cer"
+ ],
+ "timestamp": 1642943280411,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/datashare/testdata/application_gateway_test.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT222",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT222",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT223 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT223
new file mode 100644
index 0000000..e70e661
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT223
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/firewall/testdata/key.pem"
+ ],
+ "timestamp": 1642943280414,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/firewall/testdata/key.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT223",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT223",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT224 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT224
new file mode 100644
index 0000000..9286bd4
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT224
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/iothub/testdata/batch_certificate.cer"
+ ],
+ "timestamp": 1642943280417,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/iothub/testdata/batch_certificate.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT224",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT224",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT225 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT225
new file mode 100644
index 0000000..0f3ef42
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT225
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/keyvault/testdata/rsa_single.pem"
+ ],
+ "timestamp": 1642943280421,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/keyvault/testdata/rsa_single.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT225",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT225",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT226 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT226
new file mode 100644
index 0000000..cde60da
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT226
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/machinelearning/testdata/key.pem"
+ ],
+ "timestamp": 1642943280424,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/machinelearning/testdata/key.pem"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT226",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT226",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT227 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT227
new file mode 100644
index 0000000..eb59671
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT227
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/network/testdata/app_service_certificate.pfx"
+ ],
+ "timestamp": 1642943280427,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/network/testdata/app_service_certificate.pfx"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT227",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT227",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT228 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT228
new file mode 100644
index 0000000..39a5f2b
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT228
@@ -0,0 +1,30 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/web/testdata/app_service_public_certificate.cer"
+ ],
+ "timestamp": 1642943280430,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "common",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/tmp/tmp10529ea4/internal/services/web/testdata/app_service_public_certificate.cer"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT228",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "sensitive_extension"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT228",
+ "collection": "terraformtemplate",
+ "json": {}
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT23 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT23
new file mode 100644
index 0000000..5185c4d
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT23
@@ -0,0 +1,128 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/automation-account/outputs.tf",
+ "/examples/automation-account/variables.tf",
+ "/examples/automation-account/main.tf"
+ ],
+ "timestamp": 1642943279636,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/automation-account/outputs.tf",
+ "/examples/automation-account/variables.tf",
+ "/examples/automation-account/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT23",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_automation_job_schedule",
+ "azurerm_automation_runbook",
+ "azurerm_resource_group",
+ "azurerm_automation_account",
+ "azurerm_automation_schedule"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT23",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-resources",
+ "location": "${var.location}",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_automation_account",
+ "name": "example",
+ "properties": {
+ "name": "${var.prefix}-autoacc",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "sku": [
+ {
+ "name": "Basic"
+ }
+ ],
+ "compiletime_identity": "azurerm_automation_account.example"
+ }
+ },
+ {
+ "type": "azurerm_automation_runbook",
+ "name": "example",
+ "properties": {
+ "name": "Get-AzureVMTutorial",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "account_name": "${azurerm_automation_account.example.name}",
+ "log_verbose": true,
+ "log_progress": true,
+ "description": "This is an example runbook",
+ "runbook_type": "PowerShellWorkflow",
+ "publish_content_link": [
+ {
+ "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/c4935ffb69246a6058eb24f54640f53f69d3ac9f/101-automation-runbook-getvms/Runbooks/Get-AzureVMTutorial.ps1"
+ }
+ ],
+ "compiletime_identity": "azurerm_automation_runbook.example"
+ }
+ },
+ {
+ "type": "azurerm_automation_schedule",
+ "name": "one-time",
+ "properties": {
+ "name": "${var.prefix}-one-time",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "automation_account_name": "${azurerm_automation_account.example.name}",
+ "frequency": "OneTime",
+ "compiletime_identity": "azurerm_automation_schedule.one-time"
+ }
+ },
+ {
+ "type": "azurerm_automation_schedule",
+ "name": "hour",
+ "properties": {
+ "name": "${var.prefix}-hour",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "automation_account_name": "${azurerm_automation_account.example.name}",
+ "frequency": "Hour",
+ "interval": 2,
+ "compiletime_identity": "azurerm_automation_schedule.hour"
+ }
+ },
+ {
+ "type": "azurerm_automation_job_schedule",
+ "name": "example",
+ "properties": {
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "automation_account_name": "${azurerm_automation_account.example.name}",
+ "runbook_name": "${azurerm_automation_runbook.example.name}",
+ "schedule_name": "${azurerm_automation_schedule.hour.name}",
+ "compiletime_identity": "azurerm_automation_job_schedule.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT24 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT24
new file mode 100644
index 0000000..11216be
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT24
@@ -0,0 +1,109 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/azure-monitoring/eventhub_integration/main.tf"
+ ],
+ "timestamp": 1642943279639,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/azure-monitoring/eventhub_integration/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT24",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_eventhub_namespace",
+ "azurerm_resource_group",
+ "azurerm_eventhub_namespace_authorization_rule",
+ "azurerm_eventhub",
+ "azurerm_monitor_diagnostic_setting"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT24",
+ "collection": "terraformtemplate",
+ "json": {
+ "data": {
+ "azurerm_kusto_cluster": {
+ "example": {
+ "name": "examplekustocluster",
+ "resource_group_name": "example_rg_kusto_cluster",
+ "compiletime_identity": "data.azurerm_kusto_cluster.example"
+ }
+ },
+ "azurerm_monitor_diagnostic_categories": {
+ "example": {
+ "resource_id": "${data.azurerm_kusto_cluster.example.id}"
+ }
+ }
+ },
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "example",
+ "properties": {
+ "name": "example_rg_eventhub",
+ "location": "West Europe",
+ "compiletime_identity": "azurerm_resource_group.example"
+ }
+ },
+ {
+ "type": "azurerm_eventhub_namespace",
+ "name": "example",
+ "properties": {
+ "name": "exampleEventhubns",
+ "location": "${azurerm_resource_group.example.location}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "sku": "Standard",
+ "compiletime_identity": "azurerm_eventhub_namespace.example"
+ }
+ },
+ {
+ "type": "azurerm_eventhub",
+ "name": "example",
+ "properties": {
+ "name": "example_eventhub",
+ "namespace_name": "${azurerm_eventhub_namespace.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "partition_count": 2,
+ "message_retention": 1,
+ "compiletime_identity": "azurerm_eventhub.example"
+ }
+ },
+ {
+ "type": "azurerm_eventhub_namespace_authorization_rule",
+ "name": "example",
+ "properties": {
+ "name": "example_eventhubns_auth_rule",
+ "namespace_name": "${azurerm_eventhub_namespace.example.name}",
+ "resource_group_name": "${azurerm_resource_group.example.name}",
+ "listen": true,
+ "send": true,
+ "manage": true,
+ "compiletime_identity": "azurerm_eventhub_namespace_authorization_rule.example"
+ }
+ },
+ {
+ "type": "azurerm_monitor_diagnostic_setting",
+ "name": "example",
+ "properties": {
+ "name": "example_monitor_diag_setting",
+ "target_resource_id": "${data.azurerm_kusto_cluster.example.id}",
+ "eventhub_name": "${azurerm_eventhub.example.name}",
+ "eventhub_authorization_rule_id": "${azurerm_eventhub_namespace_authorization_rule.example.id}",
+ "log": [],
+ "metric": [],
+ "compiletime_identity": "azurerm_monitor_diagnostic_setting.example"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT25 b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT25
new file mode 100644
index 0000000..edae3e6
--- /dev/null
+++ b/validation/scenario-azure-terraform-hashicorp/snapshots/TRF_TEMPLATE_SNAPSHOT25
@@ -0,0 +1,187 @@
+{
+ "structure": "filesystem",
+ "error": null,
+ "reference": "main",
+ "contentType": "json",
+ "source": "gitConnectorAzureTerraHashicorp",
+ "paths": [
+ "/examples/azure-monitoring/redis-cache-monitor/variables.tf",
+ "/examples/azure-monitoring/redis-cache-monitor/main.tf"
+ ],
+ "timestamp": 1642943279642,
+ "queryuser": null,
+ "checksum": "99914b932bd37a50b983c5e7c90ae93b",
+ "node": {
+ "masterSnapshotId": "TRF_TEMPLATE_SNAPSHOT",
+ "type": "terraform",
+ "collection": "terraformtemplate",
+ "paths": [
+ "/examples/azure-monitoring/redis-cache-monitor/variables.tf",
+ "/examples/azure-monitoring/redis-cache-monitor/main.tf"
+ ],
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT25",
+ "status": "active",
+ "validate": true,
+ "resourceTypes": [
+ "azurerm_monitor_action_group",
+ "azurerm_monitor_metric_alert",
+ "azurerm_resource_group"
+ ]
+ },
+ "snapshotId": "TRF_TEMPLATE_SNAPSHOT25",
+ "collection": "terraformtemplate",
+ "json": {
+ "provider": [
+ {
+ "azurerm": {
+ "version": "=2.0.0",
+ "features": [
+ {}
+ ]
+ }
+ }
+ ],
+ "resources": [
+ {
+ "type": "azurerm_resource_group",
+ "name": "main",
+ "properties": {
+ "name": "example_rg_rediscache",
+ "location": "east us",
+ "compiletime_identity": "azurerm_resource_group.main"
+ }
+ },
+ {
+ "type": "azurerm_monitor_action_group",
+ "name": "main",
+ "properties": {
+ "name": "example-actiongroup",
+ "resource_group_name": "${azurerm_resource_group.main.name}",
+ "short_name": "exampleact",
+ "email_receiver": [
+ {
+ "name": "ishantdevops",
+ "email_address": "devops@example.com",
+ "use_common_alert_schema": true
+ }
+ ],
+ "webhook_receiver": [
+ {
+ "name": "callmyapi",
+ "service_uri": "http://example.com/alert"
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_action_group.main"
+ }
+ },
+ {
+ "type": "azurerm_monitor_metric_alert",
+ "name": "cache_hit_alert",
+ "properties": {
+ "name": " - Cache Hits Alert",
+ "resource_group_name": "",
+ "scopes": [
+ "/subscriptions//resourceGroups//providers/Microsoft.Cache/Redis/"
+ ],
+ "description": " Cache Hits Alert",
+ "criteria": [
+ {
+ "metric_namespace": "Microsoft.Cache/redis",
+ "metric_name": "cachehits",
+ "aggregation": "Total",
+ "operator": "GreaterThan",
+ "threshold": 5000
+ }
+ ],
+ "action": [
+ {
+ "action_group_id": "${azurerm_monitor_action_group.main.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_metric_alert.cache_hit_alert"
+ }
+ },
+ {
+ "type": "azurerm_monitor_metric_alert",
+ "name": "cache_miss_alert",
+ "properties": {
+ "name": " - Cache Miss Alert",
+ "resource_group_name": "",
+ "scopes": [
+ "/subscriptions//resourceGroups//providers/Microsoft.Cache/Redis/"
+ ],
+ "description": " - Cache Miss Alert",
+ "criteria": [
+ {
+ "metric_namespace": "Microsoft.Cache/redis",
+ "metric_name": "cachemisses",
+ "aggregation": "Total",
+ "operator": "GreaterThan",
+ "threshold": 5000
+ }
+ ],
+ "action": [
+ {
+ "action_group_id": "${azurerm_monitor_action_group.main.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_metric_alert.cache_miss_alert"
+ }
+ },
+ {
+ "type": "azurerm_monitor_metric_alert",
+ "name": "cache_connected_clients",
+ "properties": {
+ "name": " - Cache Connected Clients",
+ "resource_group_name": "",
+ "scopes": [
+ "/subscriptions//resourceGroups//providers/Microsoft.Cache/Redis/"
+ ],
+ "description": " - Cache Connected Clients",
+ "criteria": [
+ {
+ "metric_namespace": "Microsoft.Cache/redis",
+ "metric_name": "connectedclients",
+ "aggregation": "Total",
+ "operator": "GreaterThan",
+ "threshold": 5000
+ }
+ ],
+ "action": [
+ {
+ "action_group_id": "${azurerm_monitor_action_group.main.id}"
+ }
+ ],
+ "compiletime_identity": "azurerm_monitor_metric_alert.cache_connected_clients"
+ }
+ },
+ {
+ "type": "azurerm_monitor_metric_alert",
+ "name": "cache_cpu",
+ "properties": {
+ "name": "